函数如下:
int RecvMsg()
{
    int                 rc, ret = 0, iAccpetAddrLen;
    struct fd_set       fdread;
    struct timeval      timeout; 
    SOCKET              sockServer; 
    SOCKADDR_IN         AcceptAddr;    rc = listen(g_sockListening, 1);
    if (rc == SOCKET_ERROR) 
    { 
        closesocket(g_sockListening);
        return -1; 
    }     FD_ZERO(&fdread);
    FD_SET(g_sockListening, &fdread);    timeout.tv_sec = 5;
    timeout.tv_usec = 0;    rc = select(0, &fdread, NULL, NULL, &timeout);
    if (rc == SOCKET_ERROR)
    {
        closesocket(g_sockListening);
        return -1;                     //select failed 
    }
    else if (rc == 0)
    {
        // timeout: ret = 0
    }
    else
    {
        if (FD_ISSET(g_sockListening, &fdread))
        {
            sockServer = accept(g_sockListening, (SOCKADDR *)&AcceptAddr, &iAccpetAddrLen);
            if (sockServer == INVALID_SOCKET)
            {
                cout << "accept failed with error " << WSAGetLastError() << endl; 
                closesocket(g_sockListening);
                return -1;
            } 
            ...
        }
    }    closesocket(sockServer);    return ret; 
} 在短连接方式下,本函数被循环调用,在第一次执行到accept()函数时可正常执行,而第二次执行到accept()函数就会报错10014。不知是否有那位朋友也遇到过类似问题,或能帮兄弟看出这里的疏漏,望不吝指教,谢谢!PS:WSAEFAULT 10014:The addrlen parameter is too small or addr is not a valid part of the user address space.

解决方案 »

  1.   

    MFCClass(8dog)兄说的极是,确实应该给i赋初值。在2000年6月版的msdn里函数accept()的参数addrlen的属性是[out],而在2004年7月版的msdn里却变成了[in, out]。
    但为什么未赋初值就会导致这样的错误,还是没有彻底搞明白,望MFCClass(8dog)兄指教。谢谢!
      

  2.   

    每次都要调用listen函数侦听一次,这个函数不应该放在循环里。
    另外,调用局部变量应该变成全局变量,这样才能保持原来的连接。
      

  3.   

    谢谢!chenyc(兽医)兄说得是,listen不应放在这里,只调用listen一次就够了。只是兄的后一句“另外,调用局部变量应该变成全局变量,这样才能保持原来的连接。”我没有看懂,兄指的是哪个变量呢?
      

  4.   

    楼上几位说的是,但我还是不太明白为什么iAccpetAddrLen未赋初值就会产生这样的错误。哪位能解释一下?谢谢!