为什么WSAAsyncSelect没有跳进FD_ACCEPT?
服务端:
- C/C++ code
WSADATA wsd;SOCKET sListen;SOCKADDR_IN local;case WM_CREATE: WSAStartup(0x0202,&wsd) ;sListen = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);local.sin_addr.S_un.S_addr = htonl(INADDR_ANY);local.sin_family = AF_INET;local.sin_port = htons(5150);bind(sListen,(sockaddr *)&local,sizeof(local));listen(sListen,3);WSAAsyncSelect(sListen,hWnd,WM_USER+0,FD_ACCEPT);break;case WM_USER+0:if(WSAGETSELECTERROR(lParam)){closesocket(wParam);}switch (WSAGETSELECTERROR(lParam)){case FD_ACCEPT:sClient = accept(wParam,(struct sockaddr *)&local,&iAddrSize);WSAAsyncSelect(sClient,hWnd,WM_USER+0,FD_READ|FD_CLOSE);break; .............. }
客户端:
- C/C++ code
case WM_CREATE: (WSAStartup(0x0202,&wsd);sListen = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);local.sin_addr.S_un.S_addr = htonl(INADDR_ANY);local.sin_family = AF_INET;local.sin_port = htons(5150);if (connect(sListen,(sockaddr *)&local,sizeof(local)) != 0){MessageBox(hWnd,"1","1",MB_OK);break;}MessageBox(hWnd,"2","2",MB_OK);break;
[解决办法]
那可能,在没有错误的时候,WSAGETSELECTERROR不能使用,看它们的定义也知道了:
#define WSAGETSELECTEVENT(lParam) LOWORD(lParam)
#define WSAGETSELECTERROR(lParam) HIWORD(lParam)
另外,楼上有人说了local.sin_family = AF_INET;可能有问题,但也可能不是这里的问题,例如我在linux下,这样写就完全没有问题,在win7下就有问题。