socket error 10053,10054究竟是怎么引起的
来源:互联网 发布:dos 运行java 编辑:程序博客网 时间:2024/04/19 12:21
贴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的原因是因为在你执行这次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
- socket error 10053,10054究竟是怎么引起的
- socket error 10053,10054究竟是怎么引起的
- socket error 10053,10054究竟是怎么引起的
- 神医华佗究竟是怎么死的?
- Adobe Flash 究竟是怎么作死的?
- 究竟wifi是怎么定位我的
- AX2009批处理究竟是怎么工作的
- 癫痫病是怎么引起的 02bamvwz
- 重庆静脉曲张是怎么引起的
- 皮肤溃疡是怎么引起的?
- ADSL究竟是怎么了?!
- 这究竟是怎么了?
- 没有工作经验的程序员究竟是怎么走出第一步的?
- 研究operate = () 究竟是怎么运行的
- 死的时候究竟是怎么一个过程
- 线性布局的权重究竟是怎么一回事
- 南宁肛周脓肿是怎么引起的
- Presentation Error是由哪些字符引起的?
- Hadoop文本转换为序列文件
- MySQL索引背后的数据结构及算法原理
- 提高网站访问速度的34条军规(4-6)
- codeblocks在windows和linux上汉化
- JS的千分位算法
- socket error 10053,10054究竟是怎么引起的
- 数据库设计三大范式
- 使用 dom4j 解析 XML
- 关于高数的思维导图!!
- 提高网站访问速度的34条军规(7-10)
- uva 839 - Not so Mobile
- HDU 4628 Pieces
- UVA 591 Box of Bricks
- HelloWorld