代码如下:
m_recvEvent = CreateEvent(NULL,true,true,"同步接收的事件对象"); //人工重置,有信号while(WAIT_OBJECT_0 == WaitForSingleObject(hEvent,0))
{    ret = recvfrom(sockstr.sock,sockstr.buf,This->m_length,0,(sockaddr*)&serAddr,&fromelen);
}没有任何地方用ReSetEvent();为什么这段代码却不会无限循环呢,而是运行了4次(在recvfrom接收不到信息的情况下);
WaitForSingleObject(hEvent)和recvfrom没任何关系啊。

解决方案 »

  1.   

    我断点都把程序断的不行了,如下:
    while(WAIT_OBJECT_0 == WaitForSingleObject(dmUDP->m_hSearchEvent, 0)) //指定的对象为有信号状态,这里确实为有信号状态,直接往下执行
    {
    DWORD dwRet = WaitForSingleObject(dmUDP->m_hSearchEvent, 0);
    if (WAIT_TIMEOUT==dwRet)
    {
    TRACE("*************等待事件对象超时**********\n");
    }
    else if (WAIT_ABANDONED == dwRet)
    {
    TRACE("***************没等到**************\n");
    }
    else if (WAIT_OBJECT_0 == dwRet)
    {
    TRACE("*********等到了**********");
    }
    TRACE("*******进入了while*************\n");
    retval = recvfrom(dmUDP->m_searchSock, buf, sizeof(buf), 0, (struct sockaddr *)&from_addr, &sin_size); 
    // 分解包
    if(retval>0)
    {
    TRACE("******接收到了数据%s%d***************\n",buf,retval);
    CString str;
    str.Format("%s",buf);
    AfxMessageBox(str);
    memset(szContent,'\0',sizeof(szContent));
    dmUDP->m_pProtPackParser->Parser(buf, retval, &sCmdCod, &sSubCmdCod, &sProtVer, szContent); //buf为需要转换的内容,retval内容的长度,sCmdCod为命令码

    if(strlen(szContent)<=0) 
    {
    continue;
    }

    // 回调
    dmUDP->m_pSearchRecv(szContent,strlen(szContent));   
    }
    else
    {
    TRACE("**********sleep1*******************");
    Sleep(100);
    TRACE("**sleep2*************");
    }
    }
    TRACE("*********跳出了while**************");
    closesocket(dmUDP->m_searchSock);
    return(1);
    在没有设备的时候,调试得到的结果:
    Loaded 'C:\WINDOWS\system32\wshtcpip.dll', no matching symbolic information found.
    **********************等到了*******************************************进入了while*****************************************
    ******************************接收到了数据4*********************
    **********************等到了*******************************************进入了while*****************************************
    ******************************接收到了数据4*********************
    **********************等到了*******************************************进入了while*****************************************
    ******************************接收到了数据4*********************
    **********************等到了*******************************************进入了while*****************************************
    The thread 0x80C has exited with code 2 (0x2).
    The thread 0xE38 has exited with code 2 (0x2).
      

  2.   

    recvfrom是阻塞式的吧?都阻塞在那里了,怎么再运行下一个循环呢?
      

  3.   

    没看到 跳出了while,,直接退出了?
      

  4.   

    把循环里的那句代码注释了..给个messagebox随便弹个信息..看看效果..先排除了是不是你recvfrom的问题..话说楼主直接WaitForSingleObject()不就好,,为什么还要判断下返回值..我还特地去百度了下返回值都是什么..
      

  5.   

    确保你等待的事件对象和你所创建的事件对象句柄值一样....
    例如:你上面创建的事件对象句柄值保存在m_recvEvent 中,而WaitForSingleObject所等待的事件参数却为hEvent....不知是不是手误?
      

  6.   

    while(WAIT_OBJECT_0 == WaitForSingleObject(hEvent,0))
    中的hEvent是人工重置事件,如果处于通知状态
    则等待成功不会产生副作用,所有事件还是处于通知状态,循环一直进行