我创建了一个使用 TCP/IP 作为客户端与外部设备通信的应用程序。我正在使用 Synapse 库 (v40) 进行通信。然而,有时沟通会冻结。我设法使用 JclDebug 获取调用堆栈,表明尽管定义了超时,但接收数据包是问题所在。
使用的是德尔福 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);
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。
Edit3:我有两个客户端线程正在运行以与两个不同的主机通信。看起来只有另一个挂着。自周四以来,应用程序一直在运行。线程 #2 在 5 小时后挂起,但线程 #1 仍在运行。