【问题标题】:Synapse TBlockSocket occasionally freezesSynapse TBlockSocket 偶尔会冻结
【发布时间】:2012-09-05 03:53:43
【问题描述】:

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

使用的是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。

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

【问题讨论】:

  • TimeVal 的设置是什么?
  • @RemyLebeau 我向问题添加了更多信息。

标签: delphi tcpclient freeze winsock2 synapse


【解决方案1】:

由于找不到冻结的原因,我对代码进行了一些更改,现在最终以 CRLF 作为终止符而不是“>”来调用 RecvTerminated,它似乎可以不停地工作。

【讨论】:

    猜你喜欢
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 2018-08-08
    相关资源
    最近更新 更多