此问题与此消息"socket error: an existing connection was forcibly closed by the remote host (10054), on api 'recv'"
我们使用Delphi创建了一个多层应用程序,并在应用程序服务器上使用Borland Socket Server。
此解决方案安装在我们的几个客户端上,但只有其中一个客户端会出现此问题。不定期。
应用程序几乎在整个过程中运行良好,但是客户端部件暂时挂起......
调试客户端部分我发现此消息在冻结之前出现。
我安装了WireShark来检查数据包,这就是我发现的:
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连接组件,但我不想这样做。
非常感谢,
ž