我在一个线程建立了udp 的socket建立一个事件hRecvEvent并设置为FD_READ然后我sendto一段数据这时候想WSAWaitForMultipleEvents  等待hRecvEvent问题是 并没有数据传进来  hRecvEvent立刻被触发了  我得到的WSAWaitForMultipleEvents返回值也说明了hRecvEvent被触发sendto 也触发了FD_READ ?

解决方案 »

  1.   

    不应该啊,是否WSAWaitForMultipleEvents返回值没有处理
      

  2.   

    sendto 也触发了FD_READ?在局域网内向一个不存在的地址了送了一个数据包,是会触了一次FD_READ的,而此时你收到的数据长度为零,错误代码应该是WSAECONNECTRESET(10054)?
      

  3.   

    封装得严重  我剥离主要代码如下 HANDLE m_hKillEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    SOCKET MainSocket; MainSocket = WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED); if ( MainSocket == INVALID_SOCKET ) return -1; struct sockaddr_in inAddr;
    inAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    inAddr.sin_family = AF_INET;
    inAddr.sin_port = htons(3456); char a[10] = "hello";
    int nRet = 0;
    nRet = sendto( MainSocket,a,1,0,(PSOCKADDR)&inAddr,sizeof(inAddr)); cout <<"send to " << nRet << endl; WSAEVENT hRecvEvent = WSACreateEvent();
    if ( hRecvEvent == WSA_INVALID_EVENT ) return -1; if ( WSAEventSelect(MainSocket,hRecvEvent,FD_READ) == SOCKET_ERROR ) return -1; WSAEVENT hEvnets[2];
    hEvnets[0] = m_hKillEvent;
    hEvnets[1] = hRecvEvent; DWORD dwEventCaused = WSAWaitForMultipleEvents(2,hEvnets,FALSE,WSA_INFINITE,FALSE);
    if ( dwEventCaused == WSA_WAIT_FAILED || dwEventCaused == WAIT_OBJECT_0 ) 
    {
     
    }
    cout <<"dwEventCaused  =  " << dwEventCaused << endl; if ( MainSocket == INVALID_SOCKET ) ::closesocket (MainSocket);
    if ( m_hKillEvent != INVALID_HANDLE_VALUE )CloseHandle(m_hKillEvent);
    if ( hRecvEvent != WSA_INVALID_EVENT ) WSACloseEvent(hRecvEvent);显示了dwEventCaused = 1  hRecvEvent触发了
      

  4.   

    应该是DentistryDoctor给的答案我改动了ip地址就好了谢谢 结贴