现在做一个项目,是网络视频教学的,整个网络模型采用P2P的模式,大概有上千个用户,用一个Communication Server来负责管理所有的客户端连接,在用户登陆的时候,考虑到安全性,于是用TCP协议来发送数据,如果登录成功,返回一些信息之后,Communication Server就可以把该连接断开,把该用户的信息加入到在线列表,其他的数据信息都是用UDP协议来发送,由于要P2P传输,所以Communication Server还要复杂NAT穿透,即UDP打洞.
  现在想在Communication Server用IOCP来管理连接,尽管TCP的连接只有在登录的时候使用一下,但是考虑到由于是网络教学,可能在课程开始的前几分钟之内上千个用户会登录,从而服务器会比较繁忙.此后便是UDP打洞的消息也会在短时间之内有上千个,并且考虑到P2P连接中会有节点网络出现问题,所以客户端也会用UDP发送"心跳信息"给Communication Server,以表示自己目前在线.如果在一段时间内,没有接受到"心跳信息"就认为其已经断线.
   现在的问题是,Communication Server端既有TCP的连接,又有UDP的连接,怎么使用IOCP来管理呢?网上的例子一般都是用IOCP来管理TCP连接的,是否可以把TCP和UDP的管理结合在一起呢?听说UDP可以不需要IOCP来管理的,那么这种情况下使用什么方法比较好呢?
  麻烦各位给一点建议!谢谢!

解决方案 »

  1.   

    只有上千个用户,为什么一定要用udp呢?而且你是视频传输吧,那udp不是有很严重的丢包问题?
      

  2.   

    如果IOCP单针对TCP,而不针对UDP使用的话,建议只TCP验证后,使用进程内通讯转交给UDP即可,IOCP只负责TCP的部分.如果单只是一个在线(也就是只须接受一个心跳包或者每个包都是独立的话,UDP也可以考虑使用IOCP,只是最好不要与TCP共用.
      

  3.   

    thx两位
    To: jacklzw88(不可爱咯) 
    如果用TCP来发送的话,加上丢包重传机制,那样就会延时很大啊,而且该系统还有一个忘了说的功能就是教学的过程中,在线听课的人可以随时向讲师提问,如果延时过大,提问根本就得不到保证了.
    To:unsigned(僵哥(为什么我会到这里来……)) 
    你的意思是不是开两个处理线程,一个用于处理TCP,一个处理UDP吗?
      

  4.   

    unsigned(僵哥(为什么我会到这里来……)) 说的我看不太懂啊
      

  5.   

    你的意思是不是开两个处理线程,一个用于处理TCP,一个处理UDP吗?
    ------------------------------------
    应该说是两组职能的线程,最好是两个线程池,当然IOCP本身自行成一个线程池.
      

  6.   

    不知能否举个UDP+IOCP的例子来看下?
    用UDP的话,那么Per-Handle 结构里面应该怎么定义,那个一般有的socket成员怎么处理?因为udp的话服务器接不到socket啊.
      

  7.   

    UDP是按登录标识的,比如说按照IP+Port生成一个唯一的标识,这样子的话,就是实实在在的单一UDP用户,但是不能处理多连接的状况,另一种则是登录之后服务器给出唯一身份证号,以后在数据包当中附带身份证号,以证明身份,具体的自己去定义。然后按这个身份做一个List(不再是TCP里面的那种Socket Context)UDP因为是非连接的,所以一个用户的状态需要用一个心跳包来维持(即类似于心跳那样,在一定时间内发送一个信号以表示自己在线)。
      

  8.   

    如果是使用TCP验证UDP通讯,则可以使用TCP里面的SOCKET来做用户标识,甚至可以考虑直接挂到Socket Context结构当中。
      

  9.   

    不知能否使用TCP来发送心跳信息呢?因为用UDP发送的话,为了防止丢包,我们打算每次发送三个一样的包,减少因网络的问题而产生的丢包.然而,如果丢包比较少的话,服务器端就必须每次分析三个UDP包,这样会比较浪费,相比较使用TCP来说,两种方法那种更省资源一点呢?
    另外,看书上都说IOCP可以维持数百上千个socket连接,但是一般都不是用于维持心跳这种信息的,他们的也许没有心跳这么多的数据接收操作,但是我用来维持心跳信息的话,数据接受比较频繁,是否可以呢?麻烦高手指点一下,第一次用IOCP,问题比较多.
      

  10.   

    UDP发心跳包只是表明它自己存在(处于服务器/接受服务状态),TCP只能表明自己的状态,而并不能表明别人的状态.换句话说,TCP掉线了,UDP也未必同时掉线.
      

  11.   

    其是不存在,iocp不用理解为只管tcp,实际上它是一个异步io的队列,换句话说,任何io都可以,那么udp也可以直接放进去,只不过工作者线程判断一下,udp放入的完成健就行了,我最近也在搞这个p2p,很容易解决