请教一下,
1.
怎样才能收到FD_CONNECT事件?
在WSAAsyncSelect 之后进行 connect,总是返回10035 的错误。
如果connect 之后再执行WSAAsyncSelect,则连上之后也没有FD_CONNECT事件?
2.
FD_WRITE是系统准备好了可以发送数据了而产生的事件
但是我不太明白 它的事件处理的函数中该怎么样跟send函数发生连理?谢谢指教。。

解决方案 »

  1.   

    WSAAsyncSelect 的connect不用GetLastError,用了基本也是10035
    执行完在消息函数等消息就行了connect(m_sockConnect, ....);void CLientDlg::OnSocket(WPARAM wParam,LPARAM lParam) 

    int iEvent = WSAGETSELECTEVENT(lParam); //消息类别 
    int iErrorCode = WSAGETSELECTERROR(lParam);    //错误代码 
    SOCKET CurSock = (SOCKET)wParam; //目标socket 
    switch(iEvent) 

    case FD_CONNECT: //客户端连接请求事件 

    if (iErrorCode == 0) 
                AfxMessageBox("连接成功"); 
    else 
              AfxMessageBox("连接失败");            

      

  2.   


    1.你没弄清楚什么是异步,除非马上连接上目标,否则就是返回某个错误,至于有没有连接上,要查看FD_CONNECT有没有被触发,如果被触发,还要查检查是连接上还是没连接上.
    2.自己直接到msdn中认真看下FD_WRITE,FD_READ等的解释.
      

  3.   

    1.你调用connect完后,就不用管它了.因为是异步的,你没必要也不可能直接用connect的返回值
    等连接结果出来,自然会有FD_CONNECT.你要做的就是弄好消息函数,添加自定义消息.
    我之前就是忘记弄消息,搞的以为没有触发FD_CONNECT.
    2.这个事件在异步应该不用关心吧,我是注释掉了.如果我错了请大家指正.
      

  4.   

    调用 WSAAsyncSelect 函数之后,就会将SOCKET设置成“异步选择”的I/O模型,这个时候,对于SOCKET的操作就是异步的了,而且是和Windows的消息机制紧密结合了。在这个之后,connect等函数的操作结果(成功或不成功)都不是通过函数的返回值提现的。而是在链接成功后,通过消息机制通知应用程序,而你应该在程序的消息处理函数中来做处理。比如你在程序的某处使用了如下代码:
    WSAAsyncSelect( SKTClient, hwnd, WM_SOCKET, FD_CONNECT | FD_READ | FD_WRITE ) ;
    connect( SKTClient, (SOCKADDR*)&Addr, sizeof(Addr) ) ;当链接成功后,应用程序会收到WM_SOCKET消息。case WM_SOCKET: //WINSOCK消息
    wEvent = WSAGETSELECTEVENT( lParam ) ;
    wError = WSAGETSELECTERROR( lParam ) ;
    if( wError ) return TRUE ;
    switch( wEvent )
    {
    case FD_CONNECT:
    //链接成功
    }这样说的话您应该能明白了吧