贴2段能稳定重现10053的代码,下面是客户端:
[cpp] view plaincopy
1. WORD    VersionRequested; 
2. WSADATA WsaData; 
3.  
4. VersionRequested = MAKEWORD(2, 2); 
5.  
6. if (WSAStartup(VersionRequested, &WsaData)) 
7.     return -1; 
8.  
9. SOCKET SocketServer  = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
10. SOCKADDR_IN AddrServer; 
11. AddrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); 
12. AddrServer.sin_port             = htons(9999); 
13. AddrServer.sin_family           = AF_INET; 
14.  
15. // 连接服务器 
16. if (0 != connect(SocketServer, (SOCKADDR *)&AddrServer, sizeof(SOCKADDR))) 
17.
18.     closesocket(SocketServer); 
19.     return false
20.
21.  
22. int err = 0; 
23. char temp[] = "hello, server"
24. int rs = send(SocketServer, temp, sizeof(temp) + 1, 0); 
25.  
26. char buff[1024] = {0}; 
27. rs = recv(SocketServer, buff, sizeof(buff), 0); 
28.  
29.        // 下面这2句代码如果注释掉,后面的recv就能正解的返回0。如果不注释掉,recv就会返回-1, 
30.         // 并得到10053这个错误 
31. rs = send(SocketServer, temp, sizeof(temp) + 1, 0); 
32. err = WSAGetLastError(); 
33.  
34. rs = recv(SocketServer, buff, sizeof(buff), 0); 
sizeof是什么35. err = WSAGetLastError(); 
36.  
37. system("pause"); 
38. return 0; 
这个是服务器的:
[cpp] view plaincopy
1. WORD    VersionRequested; 
2. WSADATA WsaData; 
3.  
4. VersionRequested = MAKEWORD(2, 2); 
5.  
6. if (WSAStartup(VersionRequested, &WsaData)) 
7.
8.     printf("加载socket库失败!\n"); 
9.     return -1; 
10.
11.  
12. // 监听来自浏览器的请求 
13. SOCKET SockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
14. SOCKADDR_IN AddrClient; 
15. AddrClient.sin_family      = AF_INET; 
16. AddrClient.sin_addr.s_addr = INADDR_ANY; 
17. AddrClient.sin_port        = htons(9999); 
18.  
19. if (SockServer == INVALID_SOCKET) 
20.
21.     printf("socket初始化失败!\n"); 
22.     closesocket(SockServer); 
23.     WSACleanup(); 
24.     return -1; 
25.
26.  
27. if (bind(SockServer, (sockaddr*)&AddrClient, sizeof(AddrClient)) != 0) 
28.
29.     printf("socket绑定失败!\n"); 
30.     closesocket(SockServer); 
31.     WSACleanup(); 
32.     return -1; 
33.
34.  
35. if (listen(SockServer, 10) != 0) 
36.
37.     printf("socket监听失败!\n"); 
38.     closesocket(SockServer); 
39.     WSACleanup(); 
40.     return -1; 
41.
42.  
43. while (1) 
44.
45.     SOCKET NewSocket = accept(SockServer, NULL, NULL); 
46.     if (INVALID_SOCKET == NewSocket) 
47.     { 
48.         closesocket(NewSocket); 
49.         continue
50.     } 
51.     else 
52.     { 
53.         struct linger so_linger; 
54.         so_linger.l_onoff  = 1; 
55.         so_linger.l_linger = 30; 
56.         setsockopt(NewSocket ,SOL_SOCKET, SO_LINGER, (const char*)&so_linger, sizeof(so_linger));   
57.     } 
58.  
59.     char buff[1024]; 
60.     int rs = recv(NewSocket, buff, sizeof(buff), 0); 
61.  
62.     char temp[] = "hello, client"
63.     rs = send(NewSocket, temp, sizeof(temp) + 1, 0); 
64.  
65.     closesocket(NewSocket); 
66.
10053里说的software在我的例子中指的就是那个send函数吗,是send函数执行的时候,发现对方的套接字已经关闭了,所以它把己方的套接字也关掉了吗,然后导致后续的recv报错10053?

出现10053的原因是因为在你执行这次send的时候对端已经执行过closesocket了,而发送的数据还是被成功的推入了发送缓冲区中,因此返回了0,此时你可能还没得到FIN消息,而紧接着recv这边就得到了对端关闭socket的FIN消息,因此此时需要放弃发送缓冲中的数据,异常终止连接,所以得到了
10053错误:您的主机中的软件中止了一个已建立的连接。 

而为什么又能得到10054的错误号,原因应该在于你设置了SO_LINGER了,一但设置了它,则有一个等待时间,在该等待时间内可以处理发送缓冲区的数据,一但超时或者发送缓
冲都被发送完并被确认,则服务端有可能发送RST消息而不是FIN,此时就应该得到重置错误,也就是10054。

不同的系统对SO_LINGER的实现方式不一样,得到的结果也不一样,不知道按我这样解释是否对你有帮助。如果我有理解错误,欢迎大家指正。
socket error- Software caused connection abort. Error code : 10053
Action.c(16): Error : socket0 - Software caused connection abort. Error code : 10053.
10053这个错误,产生于socket通讯过程中,通常是这么回事:
正常的C/S通讯过程是:
Server Listen; 
Client Connect;
Server Accept; 
Client Send; 
Server Recv;
Client Close; 
Server Close
如果Client端不主动关闭连接而直接退出,则Server端的服务线程会引发一个10053错误(这种错误通常影响不太大), 而如果通讯过程中Server首先主动关闭连接,则Client端也会引发一个10053错误
网络不好的时候的情况通常是指后者,Client以为Server关了(实际是网络断了), 所以就大叫10053

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。