永发信息网

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

答案:2  悬赏:40  手机版
解决时间 2021-01-22 22:47
socket error 10053,10054究竟是怎么引起的
最佳答案
出现10053的原因是因为在你执行这次send的时候对端已经执行过closesocket了,而发送的数据还是被成功的推入了发送缓冲区中,因此返回了0,此时你可能还没得到FIN消息,而紧接着recv这边就得到了对端关闭socket的FIN消息,因此此时需要放弃发送缓冲中的数据,异常终止连接,所以得到了
10053错误:您的主机中的软件中止了一个已建立的连接。

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

不同的系统对SO_LINGER的实现方式不一样,得到的结果也不一样,不知道按我这样解释是否对你有帮助。如果我有理解错误,欢迎大家指正。
全部回答
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; 这个是服务器的: [cpp] view plaincopy 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); }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
笔记本win7开机蓝屏一闪就过 然后重启
童之梦幼儿园(怀化中方县)地址在什么地方,想
湖北中西部是指哪里
vivoy85与oppoa3哪个好?该买哪个
胃胀气打嗝怎么办
深圳A股上海A股资金账户都有什么用啊?
国内最好的法式西点课是不是赛缪尔法式西点?
贝贝家幼儿园(怀化洪江市)地址在什么地方,想
蜡烛是由石蜡制成的,请仔细回忆蜡烛及其燃烧
瑞金市气象局地址在什么地方,想过去办事,
— Im afraid I cant finish the book this w
dnf安图恩20人,成就任务只站街能完成吗??
任贤齐周华健都在一起唱过的一首歌 好像还有
狮子坡幼儿园(怀化通道)地址在什么地方,想过
金色阳光幼儿园(怀化洪江市)地址有知道的么?
推荐资讯
怎么才能把钢材成功卖出去 价格没有优势的时
请专业健身人士解答一下. 我想减掉体重2-3公
加兴乡农牧民文化技术培训学校地址好找么,我
RO 法师用什么卡增加魔法打击力
单选题找出与句中画线部分意思相同或相近的词
会泽县邮政局投递站地址在什么地方,我要处理
马桥街道湖塘幼儿园地址好找么,我有些事要过
缘定今生(增龙路)地址在什么地方,我要处理点
0334是哪里的区号
古田到深圳怎么走
里约热内卢奥运会在2016年的几月几日召开呢?
洪昌眼镜地址在什么地方,我要处理点事!
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?