使用Delphi SocketServer错误10054 api recv

时间:2014-01-29 13:23:12

标签: delphi sockets tcp socketserver

此问题与此消息"socket error: an existing connection was forcibly closed by the remote host (10054), on api 'recv'"

有关

我们使用Delphi创建了一个多层应用程序,并在应用程序服务器上使用Borland Socket Server。

此解决方案安装在我们的几个客户端上,但只有其中一个客户端会出现此问题。不定期。

应用程序几乎在整个过程中运行良好,但是客户端部件暂时挂起......

调试客户端部分我发现此消息在冻结之前出现。

我安装了WireShark来检查数据包,这就是我发现的:

  • 客户端向服务器发送请求(PSH)
  • 服务器不发送确认(ACK)
  • 客户端发送“TCP重传”5次
  • 第一个数据包后大约20秒,Wireshark显示连接重置(RST)

wireshark日志:

205 16:38:02.763757000 192.168.3.63          10.250.1.5            TCP      95     50567 > anet [PSH, ACK] Seq=1 Ack=1 Win=256 Len=41
208 16:38:03.124843000 192.168.3.63          10.250.1.5            TCP      95     [TCP Retransmission] 50567 > anet [PSH, ACK] Seq=1 Ack=1 Win=256 Len=41
212 16:38:03.725205000 192.168.3.63          10.250.1.5            TCP      95     [TCP Retransmission] 50567 > anet [PSH, ACK] Seq=1 Ack=1 Win=256 Len=41
224 16:38:04.925619000 192.168.3.63          10.250.1.5            TCP      95     [TCP Retransmission] 50567 > anet [PSH, ACK] Seq=1 Ack=1 Win=256 Len=41
243 16:38:07.318803000 192.168.3.63          10.250.1.5            TCP      95     [TCP Retransmission] 50567 > anet [PSH, ACK] Seq=1 Ack=1 Win=256 Len=41
310 16:38:12.119776000 192.168.3.63          10.250.1.5            TCP      95     [TCP Retransmission] 50567 > anet [PSH, ACK] Seq=1 Ack=1 Win=256 Len=41
346 16:38:21.725165000 192.168.3.63          10.250.1.5            TCP      54     50567 > anet [RST, ACK] Seq=42 Ack=1 Win=0 Len=0`

这种情况在一台机器上发生,而其余用户没有任何问题。这告诉我这对SocketServer来说不是问题......或者是它?

我还在ScktComp.pas上找到了这些行:

procedure TCustomWinSocket.DoOpen;
var
    timeout: Integer;
begin
    timeout := 100;
    DoSetASyncStyles;
    Event(Self, seConnecting);
    // set the read(receive) timeout
    SetSockOpt(FSocket, SOL_SOCKET, SO_RCVTIMEO, @timeout, SizeOf(timeout));
    // set the send(write) timeout
    SetSockOpt(FSocket, SOL_SOCKET, SO_SNDTIMEO, @timeout, SizeOf(timeout));
    CheckSocketResult(WinSock.connect(FSocket, FAddr, SizeOf(FAddr)), 'connect');
    ...

使用ping检查连接,我注意到一些响应超过100毫秒甚至200毫秒。这些超时(RCVTIMEO和SNDTIMEO)是否可以解决所有问题?

任何帮助?

我几乎正在重新编写试图解决这个问题的Delphi连接组件,但我不想这样做。

非常感谢,

ž

0 个答案:

没有答案