客户端:
WSAWaitForMultipleEvents(2,g_bEvent,FALSE,5000,FALSE)
我想用它作定时发送所用
(1)当超时时间到就发送一个包
(2)WSAEventSelect(s,g_bEvent[1],FD_READ|FD_CLOSE)==SOCKET_ERROR),等待读事件的到来服务器端:
也是定时发送包,客户端等待读事件的到来可是测试的时候发现,发送的包可以定时发送,可是读事件只能触发几次就不行了。
有人这样用过吗?还是这样用不可以呢?
WSAWaitForMultipleEvents(2,g_bEvent,FALSE,5000,FALSE)
我想用它作定时发送所用
(1)当超时时间到就发送一个包
(2)WSAEventSelect(s,g_bEvent[1],FD_READ|FD_CLOSE)==SOCKET_ERROR),等待读事件的到来服务器端:
也是定时发送包,客户端等待读事件的到来可是测试的时候发现,发送的包可以定时发送,可是读事件只能触发几次就不行了。
有人这样用过吗?还是这样用不可以呢?
觉得是当有事件的时候,你没有投递recv,造成了消息的堵塞
前面省略了组播的创建,其中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;