首页
社区
课程
招聘
[求助]TCP的IOCP服务端把消息广播到客户端有什么好的方法
发表于: 2009-7-29 12:38 8497

[求助]TCP的IOCP服务端把消息广播到客户端有什么好的方法

2009-7-29 12:38
8497
如题.
因为有可能一直有数据发到服务端, 现在要把这些数据广播到一部分客户端,(iocp只有一个或是两个工作线程),一条数据大小有8K左右,我现在的想法是,用轮查的方法发到要广播的客户端,但这有可能会占用很多时间,请问有什么好的方法.大牛们给点意见

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 97
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
不要在通讯线程以外直接投递发送,上一次发送不一定发送完所有数据,会导致乱序

应该为每一个会话建一个发送队列,发送完成一个完整的包,再发送下一个

给一个客户端发送数据,就是将数据包加到该会话的队列中,并且检查该客户是否有peding中的send,如果没有,启动一次发送。

在收到一个发送完成通知时,先检查上次是否发送了全部数据,如果没有,移动一下指针,继续发送,否则,发送下一个数据包(如果发送队列不空的话)

iocp模型是很高效的,一个io投递是瞬时完成的,你程序的开销主要来自各种同步(锁等待),和你的构架关系很大
2009-7-29 13:32
0
雪    币: 222
活跃值: (69)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
case IOCP_COMPLETE_WRITE:
{
//cout<<"complete write a data!******************************"<<endl;
if(!群发完毕)
{
修改指针;
lp_io->operation =IOCP_WRITE;
}//按你所说,在这里不会占用太多时间?如果占用的时间太多,会不会错过后面的数据接收?
else
{
InitIoContext( lp_io );
lp_io->operation = IOCP_READ;
}
}
break;
2009-7-29 15:01
0
雪    币: 222
活跃值: (69)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
switch( lp_io->operation )
{
  
case IOCP_WRITE:
  {
   //cout<<"post a write data!---------------------------------------"<<endl;
   //if(OnIocpWritPtr(this,lp_io,lp_key))break;
   nRet = WSASend(
    lp_io->socket,
    &lp_io->wsaBuf,
    1,
    &dwBytes,
    0,
    &lp_io->ol,NULL);
   if( ( nRet == SOCKET_ERROR ) && ( WSAGetLastError() != WSA_IO_PENDING ) )
   {
    cout<<"WSASend fail!------------------"<<WSAGetLastError()<<endl;
    closesocket( lp_io->socket );
    m_io_group.RemoveAt( lp_io );
    m_key_group.RemoveAt( lp_key );
    return FALSE;
   }
  }
  break;
2009-7-29 15:05
0
雪    币: 97
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
看来你对TCPIP协议理解有问题,TCP是不会因为接收方忙而丢包的,UDP会。

TCP协议使用超时重发和确认机制会保证数据可靠地传到另一端的。
2009-7-29 18:18
0
游客
登录 | 注册 方可回帖
返回
//