源代码如下:
int iSize = 0;
SOCKET Client;
SOCKADDR_IN ClientAddr;
memset(&ClientAddr,0,sizeof(SOCKADDR_IN));

//创建SOCKET
m_ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_ListenSocket==INVALID_SOCKET)
{
LogInfo("创建监听SOCKET失败!");
return -1;
}
else{
LogInfo("创建监听SOCKET成功!");
} SOCKADDR_IN addrSock;
addrSock.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSock.sin_family = AF_INET;
addrSock.sin_port = htons(9110);
if(SOCKET_ERROR==bind(m_ListenSocket, (SOCKADDR*)&addrSock, sizeof(SOCKADDR)))
{
LogInfo("监听端口绑定失败!");
return -1;
} /*unsigned long cmd = 1;
int nStatus=ioctlsocket(m_ListenSocket, FIONBIO, &cmd);*/ // 相关初始化处理, 创建监听套接字
listen(m_ListenSocket, 5); while(1)
{
                  //下面这一句出错
Client = accept(m_ListenSocket, (SOCKADDR*)&ClientAddr, &iSize); 
//Client = accept(m_ListenSocket, NULL, NULL); //换成这一句就不出错 
                  if(Client == INVALID_SOCKET) 

int r = WSAGetLastError();

return -1; 
}  CreateThread(NULL, NULL, Thread_RecvData, (LPVOID)Client, 0, NULL);
}

解决方案 »

  1.   

    看不出有什么问题阿,我试了一下,是ok的!只是无法得到remote的信息而已。以下转自msdn:The accept function is used with connection-oriented socket types such as SOCK_STREAM. If addr and/or addrlen are equal to NULL, then no information about the remote address of the accepted socket is returned.
      

  2.   

    为什么我的就出错?报错信息是:WSAEFAULT.
      

  3.   

    在 listen(m_ListenSocket, 5); 后加
    iSize = sizeof(struct sockaddr_in);
    就ok了,刚才没注意。
      

  4.   

    果然OK了。谢谢lifengice0706(无) 。本来查MSDN上accept的帮助,最后两个参数是out的,以为不需要赋值。看来是我理解有误