各位在完成端口模型中是如何解决一个数据包被多个工作者线程收取不同部分的问题呢? 比如一个完整的请求包500字节,但在到达服务器端时因为分包了触发了2次事件,其中一个工作者线程收取了其中的300个字节数据,另一个工作者线程收取了另外的200字节数据,或者是被同一个工作者线程2次收取,则到了服务器端后就变成了2个请求了,除了自己重新组装成一个包外,这种请求各位是如何解决的呢? 我再举个例子:比如游戏客户端发出登陆请求,先发了一个包头,后面再发了一个登陆的相关信息,到了服务器端也是先收到包头,登陆信息又被另一个工作者线程收取,此时程序就很难处理了,需要自己去重新组装。不知道各位是如何解决这中问题的,其实这个问题在WIN平台的其它异步模型、重叠I/O模型中也存在,欢迎大家讨论,分就不给了。

解决方案 »

  1.   

    就是把WSARECV收到的数据先复制到缓冲中,一个包收全了才开始处理。判断包是否收全,一般是靠自己制定的格式,例如包头两字节表示包的格式。如果你同时WSARECV了两次,那么复制到缓冲中时要注意同步问题,并且要注意两次WSARECV所获得的结果的先后次序,因为多个线程是会相互切换的。
      

  2.   

    一般来说,做网络传输,想实现对发送方数据包的完整接收,应在头部加入自已的包头,
    另一方面,对于接收端来说,用WSARecv()进行投递就只投递一次可以了,当接收到数据时,再
    调用recv()来接收剩余的内容,当接收完成后,现调用WSARecv()进行下一次数据的投递操作,
    这样就不会像楼主说的那样了,也不可能产生楼主那行的问题,要不然,理论上是没办法做到的。
      

  3.   

    这是tcp方式下的拆解包。
      

  4.   

    不过,楼主为什么要将它分包?不分包不是没事了?
    包大于65535就用TransmitFile吧
      

  5.   

    1、每个CLIENT只保持一个读请求。
    2、对读请求的包编号,不过编号处理也还是有点烦啊。你不一定先处理到先请求的包。