读书人

远程主机逼迫关闭了一个现有的连接

发布时间: 2012-12-31 11:57:52 作者: rapoo

远程主机强迫关闭了一个现有的连接。
本帖最后由 l0v3_y1n9 于 2012-02-12 01:03:50 编辑


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 then
begin
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之后,添加重连、重发数据的处理, 或者是另起线程维护这个连接, 不过觉得这里做断开重连的处理就可以了。

读书人网 >.NET

热点推荐