Synapse TBlockSocket иногда зависает
Я создал приложение, которое связывается с внешним устройством, используя TCP/IP в качестве клиента. Я использую библиотеку Synapse (v40) для общения. Иногда, однако, связь останавливается. Мне удалось получить стек вызовов с помощью JclDebug, который показал, что, несмотря на установленное время ожидания, получение пакетов является проблемой.
Delphi 2009 используется.
Что я могу сделать, чтобы решить эту проблему? Ошибка в синапсе?
[77297094] KiFastSystemCallRet
[006193FE] blcksock.TBlockSocket.InternalCanRead (Line 2741, "synapse\blcksock.pas")
[0061945C] blcksock.TBlockSocket.CanRead (Line 2764, "synapse\blcksock.pas")
[006185E5] blcksock.TBlockSocket.RecvPacket (Line 2324, "synapse\blcksock.pas")
[0061888F] blcksock.TBlockSocket.RecvTerminated (Line 2410, "synapse\blcksock.pas")
... my own code..
Редактировать: линия блокировки:
x := synsock.Select(FSocket + 1, @FDSet, nil, nil, TimeVal);
Выберите -function из winsock2 API.
Edit2: TimeVal устанавливается с помощью кода Synapse:
var
TimeVal: PTimeVal;
TimeV: TTimeVal;
..
TimeV.tv_usec := (Timeout mod 1000) * 1000;
TimeV.tv_sec := Timeout div 1000;
TimeVal := @TimeV;
if Timeout = -1 then
TimeVal := nil;
Оригинальный исходный код находится здесь: http://synalist.svn.sourceforge.net/viewvc/synalist/trunk/blcksock.pas?revision=154&view=markup
Используется время ожидания 1000.
Edit3: у меня два клиентских потока, работающих для связи с двумя разными хостами. Похоже, только другой висит. Приложение работает с четверга. Поток № 2 завис через 5 часов, но поток № 1 все еще работает.
1 ответ
Поскольку я не смог найти причину замораживания, я немного изменил код и теперь в конечном итоге вызываю RecvTermination с CRLF в качестве терминатора вместо '>', и, похоже, он работает без остановки.