Делал вот так. То есть при выполнении операции RecvPacket указывал в аргументах время ожидания (TimeOut) в мс. Так вот заметил, что таймаут часто не работает.
- Код: Выделить всё
procedure TMyTCPBlockSocket.Request;
var
BS, Prefix, Postfix: string;
begin
Connect(MyServer, MyPort);
if (LastError = 0) or (LastError = 10054) then
begin
SendString(MessageToServerByTCP+#$0D#$0A);
repeat
BS := RecvPacket(TimeOut);
FReply := FReply + BS;
until LastError <> 0;
end
else
FReply := FReply + str_QueryFailed+#$0D#$0A + LastErrorDesc;
end;
Я так полагаю в момент соединения Connect(MyServer, MyPort). Но как задать таймаут для установски соединения TCP/IP сокетов?
Добавлено спустя 1 час 44 минуты 4 секунды:
Вот что нашел
How To Change Connect Timeout
Synapse library using sockets in blocking mode. But blocking call of Connect not have any timeout. Timeout for Connect is hardcoded in communication stack of your operating system.
Any timeout property in Synapse cannot define timeout for connecting of TCP channel. It is not a bug, it depending on design of used socket API.
Exists two possible workarounds:
Call Connect in non-blocking mode. (ugly…)
Raise helper thread and after timeout try to close socket handler from this thread. (it is ugly too…)
http://www.ararat.cz/synapse/doku.php/p ... ecttimeout
Добавлено спустя 22 часа 24 минуты 47 секунд:
Может кому пригодится: проблему решил просто без всяких там ugly-решений. Я пользовался стабильной версией synapse 2012 года. В транковой же версии https://sourceforge.net/p/synalist/code/HEAD/tree/trunk/ появилось новое свойство ConnectionTimeout в объектах класса TTCPBlockSocket, которое и выполняет функцию таймаута момента соединения.