Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 threads & soccket  [new]
vizier
Member

Откуда:
Сообщений: 181
добрый день
может кто сталкивался с проблемой передачи данных в потоках с использование сокетов через протокол http?
проблема такая - передается некое количество данных через сокет, затем как положено ждем ответа сервера, но ответа нет.
такое впечатление, что сервер не получил все данные, что были указаны в Content-Length, хотя при подсчете на клиенте - все данные ушли
когда не используются потоки, то после передача тех же данных, ответ от сервера приходит.
какая может быть проблема с сокетами в thread'ами?
29 апр 20, 09:10    [22124672]     Ответить | Цитировать Сообщить модератору
 Re: threads & soccket  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26574
vizier
какая может быть проблема с сокетами в thread'ами?

Никакой, т.к. и "без потоков" сокеты работают в потоке, только в основном.
29 апр 20, 09:15    [22124675]     Ответить | Цитировать Сообщить модератору
 Re: threads & soccket  [new]
vizier
Member

Откуда:
Сообщений: 181
имеется ввиду, использование сокета в отдельном thread

TSocketThread = class(TThread)
  FSocket: TSocket;
  ...
end;
29 апр 20, 09:28    [22124682]     Ответить | Цитировать Сообщить модератору
 Re: threads & soccket  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26574
vizier,

это малоинформативный код. Например, может понадобиться очередь сообщений (которую в основном потоке VCL создает) или сокет создается в основном потоке.
29 апр 20, 09:37    [22124686]     Ответить | Цитировать Сообщить модератору
 Re: threads & soccket  [new]
vizier
Member

Откуда:
Сообщений: 181
код очень большой, поэтому сюда его не запостить.
сокет создается в потоке. передача и прием идут в том же потоке. ни каких очередей сообщений и vcl не используется.
консольное приложение
29 апр 20, 09:50    [22124691]     Ответить | Цитировать Сообщить модератору
 Re: threads & soccket  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26574
vizier
код очень большой, поэтому сюда его не запостить.

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

А так, пару причин указал выше. Может еще кто-то погадает.

Сообщение было отредактировано: 29 апр 20, 11:19
29 апр 20, 11:20    [22124759]     Ответить | Цитировать Сообщить модератору
 Re: threads & soccket  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4171
vizier
затем как положено ждем ответа сервера, но ответа нет
Код, который "как положено" - нужен обязательно.
Если это не поможет - понадобится и другой, по отсылке http-запроса.
29 апр 20, 11:38    [22124774]     Ответить | Цитировать Сообщить модератору
 Re: threads & soccket  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49980

vizier
какая может быть проблема с сокетами в thread'ами?

Исключительно в прокладке между креслом и монитором. Отлаживайтесь. Начните со сниффера
чтобы убедиться, что данные таки уходят.

Posted via ActualForum NNTP Server 1.5

29 апр 20, 12:32    [22124821]     Ответить | Цитировать Сообщить модератору
 Re: threads & soccket  [new]
Vizit0r
Member

Откуда: Одесса
Сообщений: 756
а использовать что-то готовое для http-запросов (ну например банальный TNetHttpClient) не разрешено по каким-то секретным соображениям? Обязательно изобретать свой велосипед?
29 апр 20, 13:41    [22124875]     Ответить | Цитировать Сообщить модератору
 Re: threads & soccket  [new]
vizier
Member

Откуда:
Сообщений: 181
К сожалению не подошел, не умеет работать с невалидым сертификатом (

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

кидаем 10GB и потом читаем ответ от сервера
        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);


и зараза, в основном потоке работает на ура, в отдельном потоке затыкается
29 апр 20, 14:04    [22124899]     Ответить | Цитировать Сообщить модератору
 Re: threads & soccket  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26574
vizier
в основном потоке работает на ура, в отдельном потоке затыкается

Где сокет создается?
29 апр 20, 14:13    [22124902]     Ответить | Цитировать Сообщить модератору
 Re: threads & soccket  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11759
vizier
FSocket: TSocket;
vizier
LTransfer := FSocket.Send(
Тип TSocket это число, соответственно у него не может быть методов. Значит FSocket у вас другого типа. Какого?
29 апр 20, 19:06    [22125259]     Ответить | Цитировать Сообщить модератору
 Re: threads & soccket  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26574
_Vasilisk_
vizier
FSocket: TSocket;

vizier
LTransfer := FSocket.Send(

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

Загляни в модуль ScktComp
29 апр 20, 19:56    [22125312]     Ответить | Цитировать Сообщить модератору
 Re: threads & soccket  [new]
vizier
Member

Откуда:
Сообщений: 181
_Vasilisk_, сокет это класс в System.Net.Socket
30 апр 20, 10:34    [22125567]     Ответить | Цитировать Сообщить модератору
 Re: threads & soccket  [new]
vizier
Member

Откуда:
Сообщений: 181
wadman
Где сокет создается?
в том же потоке из которого передаются данные.
создается поток -> в нем создается сокет -> передача данных > уничтожение сокета -> закрытие потока
30 апр 20, 10:36    [22125569]     Ответить | Цитировать Сообщить модератору
 Re: threads & soccket  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26574
vizier
wadman
Где сокет создается?
в том же потоке из которого передаются данные.
создается поток -> в нем создается сокет -> передача данных > уничтожение сокета -> закрытие потока

Ладно. Общей картины программисты не увидят, а гадать - это к экстрасенсам.
30 апр 20, 10:49    [22125571]     Ответить | Цитировать Сообщить модератору
 Re: threads & soccket  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26574
vizier
создается поток -> в нем создается сокет

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

То есть за всё это время мы ничего не выяснили, потому код - секретный.
30 апр 20, 10:56    [22125576]     Ответить | Цитировать Сообщить модератору
 Re: threads & soccket  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4171
vizier,

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

Если все действительно нормально отправляется - значит таки неверный запрос, и сервер продолжает что-то ждать.
30 апр 20, 10:56    [22125577]     Ответить | Цитировать Сообщить модератору
 Re: threads & soccket  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4171
wadman
Хотя побуду немного им: сокет создается вместе с потоком, то есть в основном потоке, а не в доп. потоке.
Сокет не блокирующий и ему нужна очередь сообщений.
Да, отличное предположение выдал твой шар.
30 апр 20, 10:58    [22125580]     Ответить | Цитировать Сообщить модератору
 Re: threads & soccket  [new]
ъъъъъ
Member

Откуда:
Сообщений: 666
vizier
добрый день
может кто сталкивался с проблемой передачи данных в потоках с использование сокетов через протокол http?
проблема такая - передается некое количество данных через сокет, затем как положено ждем ответа сервера, но ответа нет.
такое впечатление, что сервер не получил все данные, что были указаны в Content-Length, хотя при подсчете на клиенте - все данные ушли
когда не используются потоки, то после передача тех же данных, ответ от сервера приходит.
какая может быть проблема с сокетами в thread'ами?

В чем проблема сделать минимальное приложение, повторяющее "проблему" и выложить здесь?
30 апр 20, 11:01    [22125583]     Ответить | Цитировать Сообщить модератору
 Re: threads & soccket  [new]
vizier
Member

Откуда:
Сообщений: 181
YuRock, делал ожидание, падает по таймауту.
поведение такое же, когда отсылаешь данных меньше чем указано в Content-Length
сервер, с другой стороны, находится в ожидании данных от клиента, поэтому и не отвечает.
sleep для разгрузки потока не помогает
30 апр 20, 11:02    [22125584]     Ответить | Цитировать Сообщить модератору
 Re: threads & soccket  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4171
vizier,

Wadman написал, в чем может быть проблема. 99% она в этом.
Переведи сокет в блокирующий режим, например, для тестов.
30 апр 20, 11:08    [22125588]     Ответить | Цитировать Сообщить модератору
 Re: threads & soccket  [new]
vizier
Member

Откуда:
Сообщений: 181
wadman
сокет создается вместе с потоком, то есть в основном потоке, а не в доп. потоке.
Сокет не блокирующий и ему нужна очередь сообщений.
прошу прощения, пропустил сообщение.
сокет блокирующий, создается в работающем потоке. в методе execute.
небольшие данные, порядка 1к, заголовки http, уходят без проблем. затык на передаче больших данных. хотя тот же самый файл с помощью indy улетает ((
30 апр 20, 11:25    [22125602]     Ответить | Цитировать Сообщить модератору
 Re: threads & soccket  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4171
vizier
сокет блокирующий, создается в работающем потоке. в методе execute.
Жаль))

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

Так всё-таки на передаче затык, а не на ожидании ответа сервера?!
Перед send тоже надо select делать для ожидания возможности отправки.
Иначе системный буффер переполнится и будет хана. Плюс контроль ошибок.

Сообщение было отредактировано: 30 апр 20, 11:31
30 апр 20, 11:31    [22125606]     Ответить | Цитировать Сообщить модератору
 Re: threads & soccket  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 49980

YuRock
Иначе системный буффер переполнится и будет хана.

Не будет никакой "ханы", просто send() будет ожидать его освобождения. Проблема в прокладке.

Posted via ActualForum NNTP Server 1.5

30 апр 20, 12:16    [22125637]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить