socket error 10053,10054究竟是怎么引起的

来源:互联网 发布:如何屏蔽网络监控 编辑:程序博客网 时间:2024/06/10 03:39

贴2段能稳定重现10053的代码,下面是客户端:

WORD    VersionRequested;WSADATA WsaData;VersionRequested = MAKEWORD(2, 2);if (WSAStartup(VersionRequested, &WsaData))return -1;SOCKET SocketServer  = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);SOCKADDR_IN AddrServer;AddrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");AddrServer.sin_port             = htons(9999);AddrServer.sin_family           = AF_INET;// 连接服务器if (0 != connect(SocketServer, (SOCKADDR *)&AddrServer, sizeof(SOCKADDR))){closesocket(SocketServer);return false;}int err = 0;char temp[] = "hello, server";int rs = send(SocketServer, temp, sizeof(temp) + 1, 0);char buff[1024] = {0};rs = recv(SocketServer, buff, sizeof(buff), 0);        // 下面这2句代码如果注释掉,后面的recv就能正解的返回0。如果不注释掉,recv就会返回-1,         // 并得到10053这个错误rs = send(SocketServer, temp, sizeof(temp) + 1, 0);err = WSAGetLastError();rs = recv(SocketServer, buff, sizeof(buff), 0);err = WSAGetLastError();system("pause");return 0;
这个是服务器的:
WORD    VersionRequested;WSADATA WsaData;VersionRequested = MAKEWORD(2, 2);if (WSAStartup(VersionRequested, &WsaData)){printf("加载socket库失败!\n");return -1;}// 监听来自浏览器的请求SOCKET SockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);SOCKADDR_IN AddrClient;AddrClient.sin_family      = AF_INET;AddrClient.sin_addr.s_addr = INADDR_ANY;AddrClient.sin_port        = htons(9999);if (SockServer == INVALID_SOCKET){printf("socket初始化失败!\n");closesocket(SockServer);WSACleanup();return -1;}if (bind(SockServer, (sockaddr*)&AddrClient, sizeof(AddrClient)) != 0){printf("socket绑定失败!\n");closesocket(SockServer);WSACleanup();return -1;}if (listen(SockServer, 10) != 0){printf("socket监听失败!\n");closesocket(SockServer);WSACleanup();return -1;}while (1){SOCKET NewSocket = accept(SockServer, NULL, NULL);if (INVALID_SOCKET == NewSocket){closesocket(NewSocket);continue;}else{struct linger so_linger;so_linger.l_onoff  = 1;so_linger.l_linger = 30;setsockopt(NewSocket ,SOL_SOCKET, SO_LINGER, (const char*)&so_linger, sizeof(so_linger)); }char buff[1024];int rs = recv(NewSocket, buff, sizeof(buff), 0);char temp[] = "hello, client";rs = send(NewSocket, temp, sizeof(temp) + 1, 0);closesocket(NewSocket);}
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



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 新生儿抱着睡放下就醒怎么办 宝宝大运动发育迟缓怎么办 八个月宝宝不会爬怎么办 宝宝竖着抱早了怎么办 孕妇吃的水果少怎么办 6个月宝宝厌奶怎么办 5个月宝宝厌奶怎么办 11个月宝宝厌奶怎么办 母乳宝宝不喝奶粉怎么办 换奶粉不拉大便怎么办 宝宝和妈妈不亲怎么办 冬天榨果汁太凉怎么办 四个月宝宝拉水怎么办 婴儿吃奶吃撑了怎么办 1岁的宝宝腹泻怎么办 一岁宝宝老拉肚子怎么办 一岁宝宝拉肚子怎么办啊 小孩发烧怎么办39度要吃消炎药吗 孩子不爱吃水果蔬菜怎么办 一岁宝宝不吃水果怎么办 一岁宝宝不爱吃水果怎么办 1岁多宝宝不吃水果怎么办 中学生不爱与家长交流怎么办 孩子一直37度多怎么办 小孩39度3算高烧怎么办 7岁发烧怎么办如何退烧 7岁反复发烧7天怎么办 一岁发烧39.8度怎么办 反复发烧39度4天怎么办 大人发烧到39度怎么办 小孩高烧39度多怎么办 孩子嗓子发炎发烧怎么办吃什么药 猫咪吃了点桃子怎么办 猫吃了牛油果怎么办 苹果手机死机开不了机怎么办 新生儿出生第一天没奶水怎么办 第一天断奶奶水一直流出怎么办 3岁宝宝不长个子怎么办 5个月宝宝不长个怎么办 孩子比同龄人矮很多怎么办 孕妇做春梦宫缩怎么办