客户端:
WSAWaitForMultipleEvents(2,g_bEvent,FALSE,5000,FALSE)
我想用它作定时发送所用
(1)当超时时间到就发送一个包
(2)WSAEventSelect(s,g_bEvent[1],FD_READ|FD_CLOSE)==SOCKET_ERROR),等待读事件的到来服务器端:
也是定时发送包,客户端等待读事件的到来可是测试的时候发现,发送的包可以定时发送,可是读事件只能触发几次就不行了。
有人这样用过吗?还是这样用不可以呢?

解决方案 »

  1.   

    如果仅是想定时发送,可以使用Sleep(5000);
      

  2.   

    帖出代码,看看你的逻辑
    觉得是当有事件的时候,你没有投递recv,造成了消息的堵塞
      

  3.   



        前面省略了组播的创建,其中s是组播套接字。
    if(WSAEventSelect(s,g_bEvent[1],FD_READ|FD_CLOSE)==SOCKET_ERROR)
    {
    WSACloseEvent(g_bEvent[1]);
    return -1;
    }
    while(true)
    {
    DWORD dwWaitResult;/////////////////超时设置
    dwWaitResult = WSAWaitForMultipleEvents(2,g_bEvent,FALSE,5000,FALSE);
    if (dwWaitResult==WSA_WAIT_FAILED)
    {
    WSAEventSelect(s,g_bEvent[0], 0);
    WSAEventSelect(s,g_bEvent[1],0);
                
    WSACloseEvent(g_bEvent[0]);
    WSACloseEvent(g_bEvent[1]);
               
    return -1;
    }

    dwWaitResult=dwWaitResult-WSA_WAIT_EVENT_0;
    if(dwWaitResult==0)
    {
    WSACloseEvent(g_bEvent[0]);
    WSACloseEvent(g_bEvent[1]);
    TRACE("ÊÕ·¢Êý¾ÝÏ߳ʽáÊø");
    return -1;
    }
    if(dwWaitResult==WAIT_TIMEOUT)
    {
    g_pRtpdata.GetRRPacket(packet);
    int isEnd=sendto(s,packet,len,0,(struct sockaddr*)&rtcpmultiaddr,addrlen);
    if((isEnd!=WSAEWOULDBLOCK)&&(isEnd<0))
    {
    break;
    }
    if(isEnd==WSAEWOULDBLOCK) continue;

    ZeroMemory(packet,len);
    }
    if(dwWaitResult==1)
    {
    WSANETWORKEVENTS wNetworkEvents;
    if(WSAEnumNetworkEvents(s,g_bEvent[1],&wNetworkEvents) == SOCKET_ERROR)
    {
         WSAEventSelect(s, g_bEvent[1], 0);
    WSACloseEvent(g_bEvent[1]);
    return -1;
    }
    else if(wNetworkEvents.lNetworkEvents&FD_READ)
    {
    int packetlen;
    packetlen=recvfrom(s,packet,len,0,(struct sockaddr*)&addr,&addrlen);
                            //这里省略了包处理过程

                           }
    if(wNetworkEvents.lNetworkEvents&FD_CLOSE)
    {
    WSAEventSelect(s,g_bEvent[1], 0);
    WSACloseEvent(g_bEvent[1]);
    return 0;
    }

    WSAResetEvent(g_bEvent[1]);
    }

    }
    return 0;