首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

为啥WSAAsyncSelect没有跳进FD_ACCEPT

2012-09-02 
为什么WSAAsyncSelect没有跳进FD_ACCEPT?服务端:C/C++ codeWSADATA wsdSOCKET sListenSOCKADDR_IN local

为什么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;
先打开服务端,然后打打开客户端,结果客户端跳出MessageBox(hWnd,"2","2",MB_OK);客户端已经发出请求,但是出现个问题就是没有跳进FD_ACCEPT而是直接跳出switch()了,请问为什么会这样子?(lParam的值在调试模式看是8),是异步选择的!本人刚刚接触winsock!

[解决办法]
那可能,在没有错误的时候,WSAGETSELECTERROR不能使用,看它们的定义也知道了:
#define WSAGETSELECTEVENT(lParam) LOWORD(lParam)
#define WSAGETSELECTERROR(lParam) HIWORD(lParam)

另外,楼上有人说了local.sin_family = AF_INET;可能有问题,但也可能不是这里的问题,例如我在linux下,这样写就完全没有问题,在win7下就有问题。

热点排行