socket 总是遇到10053错误

lynuszly 2014-05-13 05:44:49
使用winsock api ,程序在windows7上运行总是遇到10053错误,在winxp下没有问题。
卡了好几天了,一直没有解决,各位觉得我哪里弄错了?
BTW,服务器端没有主动断开的代码。
代码在 http://paste.ubuntu.com/7456583/
运行的输出在http://paste.ubuntu.com/7456610/

每次的运行结果都是如上。
...全文
22856 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2014-05-14
  • 打赏
  • 举报
回复
代码发出来,让大家帮你看看咯
lynuszly 2014-05-14
  • 打赏
  • 举报
回复
引用 5 楼 worldy 的回复:
客户端代码有问题
谢谢关注,我也知道我的程序肯定有问题,但是我都折腾了几天了,还是不知道哪里出了问题
lynuszly 2014-05-14
  • 打赏
  • 举报
回复
发现问题了,确实与我的代码无关,是写服务器端的SB,为了检测链接是否断掉,毎次发送了64字节后,就用sendUrgentData函数(java写的)发送一字节数据来确定链接是否断开。结果操作系统发现对方频繁发送urgent包(这个是带外数据),觉得连接异常,就发RST包强制断开连接了。 为了这一字节,折腾了四天!!!!!!!
worldy 2014-05-14
  • 打赏
  • 举报
回复
客户端代码有问题
lynuszly 2014-05-14
  • 打赏
  • 举报
回复
引用 11 楼 lynuszly 的回复:
[quote=引用 10 楼 xihu1364 的回复:] WSACleanup(); 这种函数 就放到main 结束的时候就可以了 放在循环中...
我的程序没有任何closesocket()和cleanup()之类的函数啊[/quote] 应该说是没有检测到出错,就不会cleanup和closesocket().
lynuszly 2014-05-14
  • 打赏
  • 举报
回复
引用 10 楼 xihu1364 的回复:
WSACleanup(); 这种函数 就放到main 结束的时候就可以了 放在循环中...
我的程序没有任何closesocket()和cleanup()之类的函数啊
版主大哥 2014-05-14
  • 打赏
  • 举报
回复
WSACleanup(); 这种函数 就放到main 结束的时候就可以了 放在循环中...
版主大哥 2014-05-14
  • 打赏
  • 举报
回复
10053 主动关闭连接 看你在哪自己closesocket了 搜索closesocket的位置,全部在调用closesocket前打上日志,包括为什么为进入这里。 然后xp啊 win7啊 到处试试,看日志中是否有东西
lynuszly 2014-05-14
  • 打赏
  • 举报
回复
引用 7 楼 worldy 的回复:
代码发出来,让大家帮你看看咯
在原帖子里面我留了个代码的链接(好像这个习惯只适合在IRC聊天),发现这样好像还是不方便。 我已经发了留言给斑竹请他帮我在帖子里面贴上代码。 这里看是我的代码,其实很简单:

#include<WinSock2.h>
#include<iostream>
#include<assert.h>
#pragma comment(lib, "Ws2_32.lib")
void readall(SOCKET sock,char *buf,int len,int line)
{
	int left = len,ret;
	while(left){
		ret = recv(sock,buf+len-left,left,0);
		if (ret == SOCKET_ERROR) {
			wprintf(L"readall failed with error: %d  line:%d\n", WSAGetLastError(),line);
			closesocket(sock);
			WSACleanup();
			Sleep(10000);
			return;
		}
		left-=ret;
		if (left) {
			std::cout<<"readall line:"<<line<<"need one more time!\n";
			if (line>=75)
				std::cout<<"ret= "<<ret<<'\n';
		}
	}
}

void sendall(SOCKET sock,char *buf,int len,int line)
{
	int left = len, ret;
	while (left) {
		ret = send(sock,buf+len-left,left,0);
		if (ret == SOCKET_ERROR) {
			wprintf(L"readall failed with error: %d  line:%d\n", WSAGetLastError(),line);
			closesocket(sock);
			WSACleanup();
			Sleep(10000);
			return;
		}
		left-=ret;
		if (left){
			std::cout<<"sendall line:"<<line<<"need one more time!\n";
			if (line>=80)
				std::cout<<"ret= "<<ret<<'\n';
		}
	}
}

int main()
{
	WORD sockVersion = MAKEWORD(2,2);
    WSADATA data; 
	int ret;
    if(WSAStartup(sockVersion, &data) != 0)
    {
        return 0;
    }
	SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(sock == INVALID_SOCKET)
    {
        printf("invalid socket !");
        return 0;
    }

	sockaddr_in serAddr;
    serAddr.sin_family = AF_INET;
    serAddr.sin_port = htons(22222);
    serAddr.sin_addr.S_un.S_addr = inet_addr("172.18.19.110"); 
    if (connect(sock, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
    {
        printf("connect error !");
        closesocket(sock);
        return 0;
    }
	char buf[128];
	int j,n;
	for (j=0;j<10000;j++) {
		sprintf(buf,"%d,%d,%d\n",0,0,0);
		sendall(sock,buf,strlen(buf),__LINE__);
		readall(sock,buf,4,__LINE__);
		n = *(int *)buf;
		assert(n==4);
		/*for (int ii=0;ii<n;ii++) {
			readall(sock,buf,16,__LINE__);
		}*/
		readall(sock,buf,64,__LINE__);
		std::cout<<"j= "<<j<<std::endl;
		Sleep(1000);
	}
	std::cout<<"final j= "<<j<<std::endl;
}
然后这个执行的输出结果:

C:\Users\lynus\Desktop\mfc_socket\Release>mfc_socket.exe
readall line:84need one more time!
ret= 4
j= 0
j= 1
j= 2
j= 3
j= 4
j= 5
j= 6
j= 7
j= 8
j= 9
j= 10
j= 11
j= 12
j= 13
j= 14
j= 15
readall failed with error: 10053  line:77
^C
程序的逻辑就是,在成功的connect以后,执行一个loop,在loop里面先发送6字节数据,然后接受4字节,最后再接收64字节数据。从数据结果来看,只能运行14次loop,然后就报错了。 后来我用wireshark抓包发现,是我接收到64字节字节数据后,本机发送了一个tcp RST 包到了远端。说明确实本机主动断开了连接。我实在是弄不懂哪里有问题了。 ps。winxp运行没有问题,win7和win8都有上述问题。
lynuszly 2014-05-13
  • 打赏
  • 举报
回复
引用 3 楼 worldy 的回复:
// // MessageId: WSAECONNABORTED // // MessageText: // // An established connection was aborted by the software in your host machine. // #define WSAECONNABORTED 10053L
问题就是我的机器会主动关连接?我自己抓包发现确实是我这边的客户端关闭的
worldy 2014-05-13
  • 打赏
  • 举报
回复
// // MessageId: WSAECONNABORTED // // MessageText: // // An established connection was aborted by the software in your host machine. // #define WSAECONNABORTED 10053L
lynuszly 2014-05-13
  • 打赏
  • 举报
回复
这个帖子我也看过了,它的问题是对方服务器端主动关闭socket了,导致的客户端碰到了问题。 而我的服务器端不会主动关闭链接。我用抓包工具观察了一下,是我的客户端发起的connect reset。 很奇怪的是,我把编译好的程序放到winxp下运行就没事儿,win7就一直不行。测试了很多机器了
Eleven 2014-05-13
  • 打赏
  • 举报
回复
http://blog.csdn.net/lijianli9/article/details/8558470 看下有没有帮助, 或者用抓包工具看看,到底是怎么一回事

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧