有关完成端口模型的问题

ximenying GH-CA 产品总监  2005-09-30 12:19:19
各位在完成端口模型中是如何解决一个数据包被多个工作者线程收取不同部分的问题呢? 比如一个完整的请求包500字节,但在到达服务器端时因为分包了触发了2次事件,其中一个工作者线程收取了其中的300个字节数据,另一个工作者线程收取了另外的200字节数据,或者是被同一个工作者线程2次收取,则到了服务器端后就变成了2个请求了,除了自己重新组装成一个包外,这种请求各位是如何解决的呢?

我再举个例子:比如游戏客户端发出登陆请求,先发了一个包头,后面再发了一个登陆的相关信息,到了服务器端也是先收到包头,登陆信息又被另一个工作者线程收取,此时程序就很难处理了,需要自己去重新组装。

不知道各位是如何解决这中问题的,其实这个问题在WIN平台的其它异步模型、重叠I/O模型中也存在,欢迎大家讨论,分就不给了。

...全文
174 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Juchiyufei 2006-07-07
mark
回复
flashboy 2005-10-06
服务器端对每一个连接会话应该有一个会话上下文的数据结构, 该结构里的数据是可以在多线程间共享的. 如果一个线程收到了包头, 另一个线程又在该连接上收到了包体,应该最后都会记录在该连接会话的上下文数据结构中. 当然,这里由于涉及到同时写,需要同步.
回复
sevencat 2005-10-03
1、每个CLIENT只保持一个读请求。
2、对读请求的包编号,不过编号处理也还是有点烦啊。你不一定先处理到先请求的包。
回复
iorikingdom 2005-10-01
不过,楼主为什么要将它分包?不分包不是没事了?
包大于65535就用TransmitFile吧
回复
hxzb7215191 2005-09-30
这是tcp方式下的拆解包。
回复
lianglp 2005-09-30
一般来说,做网络传输,想实现对发送方数据包的完整接收,应在头部加入自已的包头,
另一方面,对于接收端来说,用WSARecv()进行投递就只投递一次可以了,当接收到数据时,再
调用recv()来接收剩余的内容,当接收完成后,现调用WSARecv()进行下一次数据的投递操作,
这样就不会像楼主说的那样了,也不可能产生楼主那行的问题,要不然,理论上是没办法做到的。
回复
everandforever 2005-09-30
就是把WSARECV收到的数据先复制到缓冲中,一个包收全了才开始处理。判断包是否收全,一般是靠自己制定的格式,例如包头两字节表示包的格式。

如果你同时WSARECV了两次,那么复制到缓冲中时要注意同步问题,并且要注意两次WSARECV所获得的结果的先后次序,因为多个线程是会相互切换的。
回复
ximenying 2005-09-30
自己顶一下
回复
相关推荐
发帖
网络编程
创建于2007-09-28

1.8w+

社区成员

VC/MFC 网络编程
申请成为版主
帖子事件
创建了帖子
2005-09-30 12:19
社区公告
暂无公告