如果我在server程序中用了这个function, 然后再call accept function,在没有client连接的时候,server是不是一直在listen,还是继续下去执行accept function?
因为我程序中一段代码如下:
if(m_serverSocket.Bind(localIP, nPort) != SUCCESS)
{
ERROR_MSG("bind failed");
return FALSE;
}
if( m_serverSocket.asyncSelect( hwnd, WM_SOCKET, FD_READ | FD_CLOSE ) != SUCCESS ) // Async0rize our socket
ERROR_MSG( "Failed to set socket to non-blocking mode!" );
if(m_serverSocket.Listen(5) != SUCCESS)
{
ERROR_MSG("listen failed");
return FALSE;
}
if(m_serverSocket.Accept(m_serverSocket.m_hSocket) != SUCCESS)
{
ERROR_MSG("accept failed");
return FALSE;
}
每次我一运行server,上面就跳出错误提示,accept failed。是不是跟我那个asyncSelect有关呢?因为另外一个做的练习中,我只是简单的用,没有call WSAAsyncSelect,server就会处于listen状态等待connection
是与asyncSelect有关。本来accept()是阻塞的,调用WSAAsyncSelect后设置为不阻塞,accept的返回值不再是SUCCESS,但也不是出错。
看<windows网络编程技术>第8章i/o模型 就明白了。
象这些以FD_XXXXXX形式的都是一些已定义事件,用asyncSelect就是要指定感兴趣的下一事件以及跟该事件关联的消息(一般自定义),还要做的事就是定义消息的响应函数,在响应函数里调用socket的成员函数处理该事件.