控制台下写的一个简单程序,accept会在接到连接请求时才返回
我用同样的方法用MFC写的程序,accept会立即返回?为什么啊?怎么让他在接到连接请求时再返回呢?
我没有设置阻塞或非阻塞模式
DWORD WINAPI ListenThread(LPVOID lpParameter)
{
HWND* hWnd=(HWND*)lpParameter;
SOCKET s=socket(AF_INET,SOCK_STREAM,0);
if(INVALID_SOCKET==s)
{
MessageBox(NULL,"创建套接字失败",NULL,MB_OK);
return 0;
}
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(9999);
if(SOCKET_ERROR==bind(s,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)))
{
MessageBox(NULL,"绑定套接字失败",NULL,MB_OK);
return 0;
}
if(SOCKET_ERROR==listen(s,SOMAXCONN))
{
MessageBox(NULL,"设置监听模式失败",NULL,MB_OK);
return 0;
}
SOCKET sClt;
SOCKADDR_IN addrClt;
int siLen=sizeof(siLen);
char chBuf[1024];
while(TRUE)
{
sClt=accept(s,(SOCKADDR*)&addrClt,&siLen);
recv(sClt,chBuf,sizeof(chBuf),NULL);
::PostMessage(*hWnd,UI_CLTOL,0,(LPARAM)&addrClt);
}
return 0;
}

解决方案 »

  1.   

    天。难道你不判断accept返回东西
      

  2.   

    判断返回值就可以啦吗?
    可是我改成这样也不行啊,CPU占用率很高,怎么解决啊?:do
    {
    sClt=accept(s,(SOCKADDR*)&addrClt,&siLen);
    }while(sClt==INVALID_SOCKET);
      

  3.   

    不应该啊,你没设成异步模式的话,正常情况应该一直阻塞在accept才对
      

  4.   

    int siLen=sizeof(siLen);
    ???
      

  5.   

    使用WSAGetLastError检查错误原因
      

  6.   

    2楼说的对,你应该判断下返回的是什么东西,或者是用WSAGetLastErro来检查错误。
      

  7.   

    哈哈,被4楼发现啦
    问题在这啦,改过来就OK啦
    我太大意了!
    谢谢大家啦int siLen=sizeof(SOCKADDR);