通过WSAAsyncSelect()可以设置非阻塞异步套接字
::WSAAsyncSelect(s, hDlg, WM_SOCKET, FD_CONNECT | FD_CLOSE | FD_WRITE | FD_READ);
然而设置WSAAsyncSelect()后,进行connect()与服务端连接:
if(::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1) { MessageBox(NULL, L"connect()失败!", L"提示", MB_OK); ::WSACleanup(); return 0; }
事实上在WSAAsyncSelect()设置后,就会将SOCKET设置成“异步选择”的I/O模型,这个时候,对于SOCKET的操作就是异步的了,而且是和Windows的消息机制紧密结合了。在这个之后,connect等函数的操作结果(成功或不成功)都不是通过函数的返回值提现的。而是在链接成功后,通过消息机制通知应用程序。
所以上述connect语句应当直接改为:
::connect(s, (sockaddr*)&servAddr, sizeof(servAddr));
无需进行返回值判断,将::WSACleanup();删除,否则导致connect不成功,无法与服务端进行通信。