SOCKET COsvicedApp::Connect_Server(char* &return_char)
{
SOCKET s;
WORD wVersionRequested;
WSADATA wsa;
wVersionRequested = MAKEWORD( 2, 2 );
int res = WSAStartup(wVersionRequested,&wsa);
if(res == -1)
{
return_char="1001";
return s;
}
struct sockaddr_in socket_in;
s = WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,0);
if(s == INVALID_SOCKET)
{
DWORD sd=GetLastError();
CString cc;
cc.Format("wsa:%d",sd);
return_char=cc.GetBuffer(cc.GetLength());//="1002";
return s;
}
socket_in.sin_family = AF_INET;
socket_in.sin_port = htons(5555);
socket_in.sin_addr.S_un.S_addr = inet_addr(cs_serip);
int con_res=0;
int iiercut=0;
line1:
con_res = connect(s,(struct sockaddr*)&socket_in,sizeof(socket_in));
if(con_res == SOCKET_ERROR)
{
CString ccc;
DWORD ldrerrid=GetLastError();
if (ldrerrid==10048)
{
Sleep(1000);
iiercut++;
if (iiercut>3)
{
}
else
{
goto line1;
}
}
ccc.Format("con[%d]:%d",iiercut,ldrerrid);
return_char=ccc.GetBuffer(ccc.GetLength());//="1002";
closesocket(s);
WSACleanup();
return s;
}
else
{
return_char="0000";
return s;
}
}这些代码,是在一个DLL里面的,当我for几千次调用这个DLL时,connect会报错:10048,求高人解决这个问题
{
SOCKET s;
WORD wVersionRequested;
WSADATA wsa;
wVersionRequested = MAKEWORD( 2, 2 );
int res = WSAStartup(wVersionRequested,&wsa);
if(res == -1)
{
return_char="1001";
return s;
}
struct sockaddr_in socket_in;
s = WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,0);
if(s == INVALID_SOCKET)
{
DWORD sd=GetLastError();
CString cc;
cc.Format("wsa:%d",sd);
return_char=cc.GetBuffer(cc.GetLength());//="1002";
return s;
}
socket_in.sin_family = AF_INET;
socket_in.sin_port = htons(5555);
socket_in.sin_addr.S_un.S_addr = inet_addr(cs_serip);
int con_res=0;
int iiercut=0;
line1:
con_res = connect(s,(struct sockaddr*)&socket_in,sizeof(socket_in));
if(con_res == SOCKET_ERROR)
{
CString ccc;
DWORD ldrerrid=GetLastError();
if (ldrerrid==10048)
{
Sleep(1000);
iiercut++;
if (iiercut>3)
{
}
else
{
goto line1;
}
}
ccc.Format("con[%d]:%d",iiercut,ldrerrid);
return_char=ccc.GetBuffer(ccc.GetLength());//="1002";
closesocket(s);
WSACleanup();
return s;
}
else
{
return_char="0000";
return s;
}
}这些代码,是在一个DLL里面的,当我for几千次调用这个DLL时,connect会报错:10048,求高人解决这个问题
解决方案 »
- MFC 沿着一个半径为R1的虚拟圆周,使用半径R2画圆 怎么实现??
- 求VC++开发自定义控件,读写XML、操作DataSet、连接数据库实例资源
- 串口通信界面接收还是没反应
- SQL数据查询问题
- 迷惑!!!!!请教一个问题??请指教!!
- 截取含有汉字的字符窜出现半个汉字的问题
- 如何在FTP 服务器上创建一个文件夹??CFtpConnection。CreateDirectory 的参数如何写??
- DrawText截断显示,如何获取显示了多少汉字?
- 请教一下*.cdr是什么文件?要用什么才能打开?
- MFC中如何让一个多行的文字自适应居中绘制出来
- 引用lib中的类静态函数出问题
- hello,MFC的一个基本问题
linger.l_onoff = 1;
linger.l_linger = 30;
if( setsockopt(s,SOL_SOCKET, SO_REUSEADDR,(char*)&linger, sizeof(linger)) == -1 )
{
return_char="setcokopt:-1";
closesocket(s);
WSACleanup();
return s;
}就算我试为linger.l_onoff = 0,情况还是一样,0,1我都试过
Typically, only one usage of each socket address (protocol/IP address/port) is permitted. This error occurs if an application attempts to bind a socket to an IP address/port that has already been used for an existing socket, or a socket that wasn't closed properly, or one that is still in the process of closing. For server applications that need to bind multiple sockets to the same port number, consider using setsockopt(SO_REUSEADDR). Client applications usually need not call bind at all—connect chooses an unused port automatically. When bind is called with a wildcard address (involving ADDR_ANY), a WSAEADDRINUSE error could be delayed until the specific address is committed. This could happen with a call to another function later, including connect, listen, WSAConnect, or WSAJoinLeaf.
建议socket套接字设置可重用属性:setsockopt(SO_REUSEADDR)