powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / threads & soccket
25 сообщений из 30, страница 1 из 2
threads & soccket
    #39952699
vizier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
добрый день
может кто сталкивался с проблемой передачи данных в потоках с использование сокетов через протокол http?
проблема такая - передается некое количество данных через сокет, затем как положено ждем ответа сервера, но ответа нет.
такое впечатление, что сервер не получил все данные, что были указаны в Content-Length, хотя при подсчете на клиенте - все данные ушли
когда не используются потоки, то после передача тех же данных, ответ от сервера приходит.
какая может быть проблема с сокетами в thread'ами?
...
Рейтинг: 0 / 0
threads & soccket
    #39952700
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vizier
какая может быть проблема с сокетами в thread'ами?

Никакой, т.к. и "без потоков" сокеты работают в потоке, только в основном.
...
Рейтинг: 0 / 0
threads & soccket
    #39952702
vizier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
имеется ввиду, использование сокета в отдельном thread

Код: pascal
1.
2.
3.
4.
TSocketThread = class(TThread)
  FSocket: TSocket;
  ...
end;
...
Рейтинг: 0 / 0
threads & soccket
    #39952705
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vizier,

это малоинформативный код. Например, может понадобиться очередь сообщений (которую в основном потоке VCL создает) или сокет создается в основном потоке.
...
Рейтинг: 0 / 0
threads & soccket
    #39952709
vizier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
код очень большой, поэтому сюда его не запостить.
сокет создается в потоке. передача и прием идут в том же потоке. ни каких очередей сообщений и vcl не используется.
консольное приложение
...
Рейтинг: 0 / 0
threads & soccket
    #39952754
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vizier
код очень большой, поэтому сюда его не запостить.

Придется потрудиться создать минимальный воспроизводимый пример. Без обработчиков и т.п. Либо вырезать "секретные" участки кода из проекта и показать.

А так, пару причин указал выше. Может еще кто-то погадает.
...
Рейтинг: 0 / 0
threads & soccket
    #39952765
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vizier
затем как положено ждем ответа сервера, но ответа нет
Код, который "как положено" - нужен обязательно.
Если это не поможет - понадобится и другой, по отсылке http-запроса.
...
Рейтинг: 0 / 0
threads & soccket
    #39952796
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vizierкакая может быть проблема с сокетами в thread'ами?

Исключительно в прокладке между креслом и монитором. Отлаживайтесь. Начните со сниффера
чтобы убедиться, что данные таки уходят.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
threads & soccket
    #39952836
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а использовать что-то готовое для http-запросов (ну например банальный TNetHttpClient) не разрешено по каким-то секретным соображениям? Обязательно изобретать свой велосипед?
...
Рейтинг: 0 / 0
threads & soccket
    #39952849
vizier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К сожалению не подошел, не умеет работать с невалидым сертификатом (

Велосипед простой:

кидаем 10GB и потом читаем ответ от сервера
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        while LCount > 0 do
        begin
          LTransfer := FSocket.Send(FWriteBuffer, Result, Min(LCount, BUFFER_SIZE), []);
          TThread.Sleep(0);
          Dec(LCount, LTransfer);
          Inc(Result, LTransfer);
        end;
...

        Result := FSocket.Receive(FReadBuffer);



и зараза, в основном потоке работает на ура, в отдельном потоке затыкается
...
Рейтинг: 0 / 0
threads & soccket
    #39952852
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vizier
в основном потоке работает на ура, в отдельном потоке затыкается

Где сокет создается?
...
Рейтинг: 0 / 0
threads & soccket
    #39953015
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vizier
Код: pascal
1.
FSocket: TSocket;

vizier
Код: pascal
1.
LTransfer := FSocket.Send(

Тип TSocket это число, соответственно у него не может быть методов. Значит FSocket у вас другого типа. Какого?
...
Рейтинг: 0 / 0
threads & soccket
    #39953055
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
vizier
Код: pascal
1.
FSocket: TSocket;


vizier
Код: pascal
1.
LTransfer := FSocket.Send(


Тип TSocket это число, соответственно у него не может быть методов. Значит FSocket у вас другого типа. Какого?

Загляни в модуль ScktComp
...
Рейтинг: 0 / 0
threads & soccket
    #39953190
vizier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_, сокет это класс в System.Net.Socket
...
Рейтинг: 0 / 0
threads & soccket
    #39953191
vizier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman
Где сокет создается?
в том же потоке из которого передаются данные.
создается поток -> в нем создается сокет -> передача данных > уничтожение сокета -> закрытие потока
...
Рейтинг: 0 / 0
threads & soccket
    #39953193
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vizier
wadman
Где сокет создается?
в том же потоке из которого передаются данные.
создается поток -> в нем создается сокет -> передача данных > уничтожение сокета -> закрытие потока

Ладно. Общей картины программисты не увидят, а гадать - это к экстрасенсам.
...
Рейтинг: 0 / 0
threads & soccket
    #39953195
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vizier
создается поток -> в нем создается сокет

Хотя побуду немного им: сокет создается вместе с потоком, то есть в основном потоке, а не в доп. потоке.
Сокет не блокирующий и ему нужна очередь сообщений.
wadman
Например, может понадобиться очередь сообщений (которую в основном потоке VCL создает) или сокет создается в основном потоке.

То есть за всё это время мы ничего не выяснили, потому код - секретный.
...
Рейтинг: 0 / 0
threads & soccket
    #39953196
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vizier,

Я так понял, зависает на Receive. Значит, действительно сервер ничего не шлёт.
Перед (вместе с) Receive нужна какая-нибудь WaitForData, в которой делается select. Я не знаю, как там в этом компоненте называется подобный метод. Иначе перестаешь контролировать управление потоком.
Но сервер, в свою очередь, должен по таймауту дисконнектить тебя, и упасть должно и WaitForData, и Receive.

Если все действительно нормально отправляется - значит таки неверный запрос, и сервер продолжает что-то ждать.
...
Рейтинг: 0 / 0
threads & soccket
    #39953198
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
Хотя побуду немного им: сокет создается вместе с потоком, то есть в основном потоке, а не в доп. потоке.
Сокет не блокирующий и ему нужна очередь сообщений.
Да, отличное предположение выдал твой шар.
...
Рейтинг: 0 / 0
threads & soccket
    #39953200
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vizier
добрый день
может кто сталкивался с проблемой передачи данных в потоках с использование сокетов через протокол http?
проблема такая - передается некое количество данных через сокет, затем как положено ждем ответа сервера, но ответа нет.
такое впечатление, что сервер не получил все данные, что были указаны в Content-Length, хотя при подсчете на клиенте - все данные ушли
когда не используются потоки, то после передача тех же данных, ответ от сервера приходит.
какая может быть проблема с сокетами в thread'ами?

В чем проблема сделать минимальное приложение, повторяющее "проблему" и выложить здесь?
...
Рейтинг: 0 / 0
threads & soccket
    #39953201
vizier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRock, делал ожидание, падает по таймауту.
поведение такое же, когда отсылаешь данных меньше чем указано в Content-Length
сервер, с другой стороны, находится в ожидании данных от клиента, поэтому и не отвечает.
sleep для разгрузки потока не помогает
...
Рейтинг: 0 / 0
threads & soccket
    #39953203
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vizier,

Wadman написал, в чем может быть проблема. 99% она в этом.
Переведи сокет в блокирующий режим, например, для тестов.
...
Рейтинг: 0 / 0
threads & soccket
    #39953216
vizier
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman
сокет создается вместе с потоком, то есть в основном потоке, а не в доп. потоке.
Сокет не блокирующий и ему нужна очередь сообщений.
прошу прощения, пропустил сообщение.
сокет блокирующий, создается в работающем потоке. в методе execute.
небольшие данные, порядка 1к, заголовки http, уходят без проблем. затык на передаче больших данных. хотя тот же самый файл с помощью indy улетает ((
...
Рейтинг: 0 / 0
threads & soccket
    #39953220
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vizier
сокет блокирующий, создается в работающем потоке. в методе execute.
Жаль))

vizier
затык на передаче больших данных. хотя тот же самый файл с помощью indy улетает ((

Так всё-таки на передаче затык, а не на ожидании ответа сервера?!
Перед send тоже надо select делать для ожидания возможности отправки.
Иначе системный буффер переполнится и будет хана. Плюс контроль ошибок.
...
Рейтинг: 0 / 0
threads & soccket
    #39953243
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockИначе системный буффер переполнится и будет хана.

Не будет никакой "ханы", просто send() будет ожидать его освобождения. Проблема в прокладке.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / threads & soccket
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]