我在theApp  的InitInstance()中使用了WSAAsyncSelect但是报错10022  
代码如下:  if(::WSAAsyncSelect(m_socket,  (HWND)m_pMainWnd,  WM_SOCKET,  FD_ACCEPT  ¦FD_CLOSE)  ==  0)  
                       AfxMessageBox("ok");  请问是什么原因,是不是必须绑定到一个dlg上? 
后来改成将WSAAsyncSelect的第二个参数(HWND)m_pMainWnd改为m_pMainWnd->GetSafeHwnd()就不报错了
但是却不能响应消息处理函数
请问这是为什么?
我在头文件和.cpp文件中定义了MESSAGE_MAP的

解决方案 »

  1.   

    我做的是C/S
    在服务器端做使用WSAAsyncSelect
    客户端可以连接的,
    但服务器端不能响应
      

  2.   

    long CDmApp::OnSocket(WPARAM wParam, LPARAM lParam)
    {
    AfxMessageBox("onsocket");
    SOCKET s = wParam;
    if(WSAGETSELECTERROR(lParam)) {
    AfxMessageBox("wsagetselect error");
    ::closesocket(s);
    return 0;
    }
    switch(WSAGETSELECTEVENT(lParam))
    {
    case FD_ACCEPT: {
    AfxMessageBox("接到客户端的连接!");
    SOCKET client = ::accept(s, NULL, NULL);
    WSAAsyncSelect(client, m_pMainWnd->GetSafeHwnd(), WM_SOCKET, FD_READ|FD_WRITE|FD_CLOSE);
    }
    break;
    case FD_CLOSE: {
    ::closesocket(s);
    AfxMessageBox("客户端已经断开连接!");
    }
    break;
    case FD_READ:
    {
    AfxMessageBox("on read");
    }
    break;
    }
    return 0;
    }
      

  3.   

    怎样和 CDmApp::OnSocket(WPARAM wParam, LPARAM lParam)
    关联
      

  4.   

    其中
         BEGIN_MESSAGE_MAP(CDmApp, CWinApp)
    //{{AFX_MSG_MAP(CDmApp)
    ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
    ON_MESSAGE(WM_SOCKET, OnSocket)
    //}}AFX_MSG_MAP
    // Standard file based document commands
    END_MESSAGE_MAP()
    还有头文件中:
         //{{AFX_MSG(CDmApp)
    afx_msg long OnSocket(WPARAM wParam, LPARAM lParam);
    afx_msg void OnAppAbout();
    //}}AFX_MSG
    应该没问题的啊
      

  5.   

    不是就使用WSAAsyncSelect实现消息关联吗?要不就是我不懂...
      

  6.   

    程序中我是这样初始化socket的:
    // for socket init
    m_socket = INVALID_SOCKET;
    if(m_socket == INVALID_SOCKET)
    ::closesocket(m_socket);
    //创建套接字
    m_socket = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(m_socket == INVALID_SOCKET) {
    AfxMessageBox("sock create error");
    return FALSE;
    }
    //填写要关联的本地地址
    sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(4567);
    sin.sin_addr.s_addr = INADDR_ANY;
    //绑定端口
    if(::bind(m_socket, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR) {
    AfxMessageBox("bind error");
    return FALSE;
    }
    //设置socket为窗口通知消息类型
    if(::WSAAsyncSelect(m_socket, m_pMainWnd->GetSafeHwnd(), WM_SOCKET, FD_ACCEPT|FD_CLOSE) == 0)
    AfxMessageBox("WSAAsyncSelect ok"); if(::listen(m_socket, 100) == 0)
    AfxMessageBox("listen ok");
      

  7.   

    我以前做的一个基于对话框的程序中就是这样子做的啊,
    WM_SOCKET 定义为WM_USER+1也应该没问题的啊,
    郁闷!
    是不是不能从主工程文件中使用
    还是必须把它关联到一个dlg对话框中??