远程主机强迫关闭了一个现有的连接。
- Delphi(Pascal) code
dwCount := 0;bConnected := False;Sock := Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if Sock = SOCKET_ERROR then Exit;SockAddr.sin_family := AF_INET;SockAddr.sin_addr.S_addr := inet_addr(PChar('192.168.1.110'));SockAddr.sin_port := htons(7000);bConnected := Connect(Sock, SockAddr, SizeOf(SockAddr)) <> SOCKET_ERROR;if bConnected thenbegin while true do begin Inc(dwCount); Send(Sock, dwCount的值, SizeOf(dwCount), 0); recvLen := Recv(Sock, RecvBuf, SizeOf(RecvBuf), 0);//程序执行大概15分钟后,这个recvLen变成-1,通过WSAGetLastError获得错误号是10054 也就是"远程主机强迫关闭了一个现有的连接。" end; CloseSocket(Sock);end;测试了十多次基本上都是有周期性的,每隔15分钟被远程主机关闭.排除网线和网络以及远程主机的服务端问题.
我现在的问题是,有什么方法能够避免远程主机服务端做这么猥琐的动作?一开始我以为发包太猛,我尝试过在循环里面加入sleep(100); 也一样会周期性出错.
如果没办法控制这个错误的出现,出现错误后我如何继续循环发送dwCount之前累加的值,Sock出错后是不是需要重新创建套接字?如果把Connect上面那大段代码搬过来实在觉得不太美观~ 有什么更好点的方法?
初接触winsock 望指教
[解决办法]
recvLen变成-1之后,添加重连、重发数据的处理, 或者是另起线程维护这个连接, 不过觉得这里做断开重连的处理就可以了。