Synapse. Таймаут для TCP/IP соединения

Модератор: Модераторы

Ответить
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Synapse. Таймаут для TCP/IP соединения

Сообщение Ichthyander »

Как настроить таймаут для TCP соединения в synapse в классе TTCPBlockSocket
Делал вот так. То есть при выполнении операции 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, которое и выполняет функцию таймаута момента соединения.
Ответить