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,求高人解决这个问题

解决方案 »

  1.   

    是TCP连接处于TIME_WAIT状态,地址没释放。记得应该设置linger选项(onoff=1, linger=0),可以在网上查一下或找《WinSock网络编程经络》里有说明。
      

  2.   

    struct linger linger = { 0 };
    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我都试过
      

  3.   

    only one usage of each socket address is normally permitted.WSAEADDRINUSE
      

  4.   

    Address already in use. 
    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)