Win32 API编程:网络编程在设置WSAAsyncSelect模型后connect的返回值问题

通过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不成功,无法与服务端进行通信。

原文地址:https://www.cnblogs.com/fancing/p/6559055.html