本帖最后由 VisualEleven 于 2012-08-22 14:16:51 编辑

解决方案 »

  1.   

    bind(sListen,(sockaddr *)&local,sizeof(local));
    listen(sListen,3);
    WSAAsyncSelect(sListen,hWnd,WM_USER+0,FD_ACCEPT);
    顺序对吗?
     
      

  2.   

    判断winsocket函数的是否调用成功应该是和SOCKET_ERROR比较吧
      

  3.   

    不是很明白是什么意思,但是客服端请求连接的时候,的确是跳到case WM_USER+0:里面去的,这样不是能说明WSAAsyncSelect()这个函数起作用吗?其他的函数都用返回值来测试过了,应该是没有问题
      

  4.   

    书上对,你就不用来问了WSAAsyncSelect放在 listen前面
      

  5.   

    case WM_USER+0:
    能进去么?
      

  6.   

    客户端执行到MessageBox(hWnd,"2","2",MB_OK);
    说明根本没有连接成功,也没有阻塞在connect处,所以你的服务根本没有建立起来,即listen都没有成功。
      

  7.   

    local.sin_family = AF_INET;
    这句出了问题,在客户端不能把地址设为AF_INET,如果你在自己机器上调试就用“127.0.0.1”吧。试试看
      

  8.   

    我做过了if (listen(sListen,3) != 0)
    {
    MessageBox(hWnd,"4","4",MB_OK);
    break ;
    }
    发现也没有出现MessageBox(hWnd,"4","4",MB_OK);所以listen是成功才对
      

  9.   

    我发现了我把WSAGETSELECTERROR改成WSAGETSELECTEVENT竟然能成功跳进了FD_ACCEPT
      

  10.   

    那可能,在没有错误的时候,WSAGETSELECTERROR不能使用,看它们的定义也知道了:
    #define WSAGETSELECTEVENT(lParam)       LOWORD(lParam)
    #define WSAGETSELECTERROR(lParam)       HIWORD(lParam)另外,楼上有人说了local.sin_family = AF_INET;可能有问题,但也可能不是这里的问题,例如我在linux下,这样写就完全没有问题,在win7下就有问题。
      

  11.   

    你的 switch 不能用 WSAGETSELECTERROR 判断 ,这是错误码,必须用 WSAGETSELECTEVENT,这才是发生的事件。可以参考《WinSock网络编程经络》,下载地址:http://download.csdn.net/detail/geoff08zhang/4571358,解压后的目录中 Finger 程序是用异步 socket 实现的,可以参考。switch (WSAGETSELECTERROR(lParam)) 修改为: -> WSAGETSELECTEVENT(lParam)
    {
    case FD_ACCEPT:
    // 增加
    if (WSAGETSELECTERROR(lParam)) // 成功时是 0.
        break;
    sClient = accept(wParam,(struct sockaddr *)&local,&iAddrSize);
    WSAAsyncSelect(sClient,hWnd,WM_USER+0,FD_READ|FD_CLOSE);
    break;