关于网友提出的“ IOCP 服务端接收多个客户端数据乱序问题”问题疑问,本网通过在网上对“ IOCP 服务端接收多个客户端数据乱序问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: IOCP 服务端接收多个客户端数据乱序问题
描述: 想了一天也没想明白,希望大牛们给点帮助,小弟新手,刚刚接触IOCP。
问题是这样的:如果有两个客户端A和B连接一个IOCP服务器,我定义的协议格式为:数据头+真实数据 数据头就是存真实数据的长度
这样一种情况发生了,工作者线程GetQueuedCompletionStatus先收到了A的数据头,得之了A数据的长度,然后收到了A的第一块数据(A要传给服务器的数据很大,必须分多次传输),然后工作者线程GetQueuedCompletionStatus收到了B的数据,这样的话当我用A的数据头做判断的时候就把B的数据也算了进来,当这种情况发生时应该如何处理呢?
核心问题就是如果有10000个客户端发来数据,因为有4个工作者线程,他们会在不同时间收到不同客户端的数据,而且数据很凌乱的,例如先收到A在收到D在收到B,而里面的PER_IO_OPERATION_DATA(IO操作的那个数据结构)缓存如何组装这些数据呢(因为存在A收到一个数据包时还不够整体的长度,缓存4096kb,想要的数据长大于4096就要接收多次),难道要有一个结构记录连接上来客户端的每一个socket,然后根据socket来找到对应的分片来组装?这样的话如果有10000个客户岂不是要挨个判断?
解决方案1:
解决方案2: 楼主说的非常有道理,提的问题也很好。
因为是TCP传输,是基于流的数据。所以必然要有变量去记录组包的过程。
楼主并不是分不清不同的socket,而是要组包时,需要遍历所有的socket,找到对应的变量觉得很不可思议。
假设有10000个客户端,这事是不能这么做的。
给你个思路:
你可以再lpCompletionKey中做文章,加入相关的变量。当然还有其他方式,这个可以自己设计。
解决方案3: IOCP的核心是网络与数据处理分开,每个线程在每次有数据到来时会有三个数据带进接收线程:socke句柄、网络到来的数据的缓存指针、socket句柄对应的缓存数据结构指针;关键就在第3个socket句柄对应的缓存数据结构指针这个结构上,不会导致客户端A与客户端B的数据弄混,因为每个客户端对应的socket句柄是不相同的,这样可以保证客户端A接收的数据在客户端A对应的数据结构内。
至于数据的分包与粘包处理,这是TCP必须处理的,可以另开线程进行数据处理,IOCP的线程只负责接收数据。
以上介绍了“ IOCP 服务端接收多个客户端数据乱序问题”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2955462.html