Synapse TBlockSocket偶尔冻结

时间:2012-09-12 07:13:05

标签: delphi tcpclient freeze winsock2 synapse

我创建了一个应用程序,它使用TCP / IP作为客户端与外部设备进行通信。我正在使用Synapse库(v40)进行通信。但有时通信会冻结。我设法用JclDebug获取callstack,显示尽管定义了超时,但是接收数据包是个问题。

使用Delphi 2009。

我能解决这个问题吗? Synapse中的错误?

[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);

Select -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次。

编辑3:我有两个客户端线程正在运行以与两个不同的主机通信。看起来只有其他人挂了。应用程序自周四以来一直在运行。线程#2在5小时后挂起,但线程#1仍在运行。

1 个答案:

答案 0 :(得分:1)

由于我找不到冻结的原因,我稍微改变了代码,现在最终调用RecvTerminated CRLF作为终结符而不是'>',它似乎没有停止工作。