iocp中如何接收分段数据包? 本帖最后由 VisualEleven 于 2012-09-15 14:34:39 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不要在一个socket上提交多次的wsarecv或者wsasend 数据包本身应该要有一定的格式,比如:包长+包内容不管这个包被分到多少分,或者多少个线程同时接收,我们都有办法根据接收包的先后顺序和socket的连接id,将某个socket连接的某个包组成一个完整的包比如为每个socket建一个缓冲区,收到该socket的不完整的包都放在这缓冲区里面,在根据包长来判定这个包是否完整 同时有多个线程接收同一个socket传来的数据这个是你的设计问题,与iocp无关,其它模型也可以做成这样;至于如果判断数据接收完毕,与网络编译无关,更别说iocp了。那是你的业务逻辑。你想像成网络编程为如下的样子:一头不停的把数据放上传送带,一次可放任意数据;一头不停的从传送带上取出数据,一次同样可取任意数据(根据你的网络好坏,机器好坏等)。 1、在一个socket上一次只要投递一个WSARecv,不要投递多个2、接收数据需要分包处理,你也可以统一设置为固定长度的数据结构,就省去了分包的复杂,不足这处是会浪费网络带宽3、消息包一般应该:标识+长度+消息实体 就是说我只要判断当前的socket是哪一个就行了,多个线程会顺序的从完成端口获取数据,我只需要把当前执行的线程中的数据取出来,放到缓存区就行了,对吧?? 我现在发送的数据中就包含包头+包体两部分,包头中有整个包的数据长度,我就是根据该值判断数据传输是否完成的。socket发送,有时不会一次把数据发完,我这里主要是想问的是:每次线程执行的时候,我是不是只用根据socket的值,依次取出相应socket对应的缓存数组,然后把数据依次的保存到该数组后面,这样接到的包中数据的顺序应该就是正确的顺序吧?!我这样测试过,貌似是正确的。 无法处理。就像2L所说,不要同时存在多个send或recv。就是说,最多只能同时存在1个未决的send和1个未决的recv 看看这个http://www.vckbase.com/index.php/wv/10 他的意思应该是在同一个socket上面,最多只能同时存在1个未决的send和1个未决的recv 就是说我不能一次循环发送多个WSASend函数 不要在同一socket上,同时投递,等get返回再进行其他的send,recv 我现在已经处理好分包的问题了继续发问:如果即要处理分包问题,又要处理多个客户端socket的链接,这样的情况,应该需要处理多个线程和socket的同步和互斥操作,该如何做呢? 自定义协议中指定包头中包含整个数据包的长度字段值。在接收到数据分是,获取包头中这个值,然后对比已经接收到的数据长度,如果等于这个值,表示接完了,否则,继续发送recv接收剩下的数据。 已知bmp文件中的数据流,怎么讲这个bmp图片在对话框中显示出来? 如何由用户指定文件夹路径 MessageBoxA为何能显示中文 模板类可以编译成动态链接库吗?(DLL) 视频捕捉问题: 好头疼,各位帮帮忙! 如何进入另一个对话框 我在这里祝福大家:一帆风顺、二龙腾飞、三羊开泰、四季平安、五福临门、六六大顺、七星高照、八方来财、九就同心、十全十美。 如何编程探测一指定IP是否可用 请问tab control控件的使用方法 打开记录集失败 vs2010自动生成的CClassView中树控件刷新问题
不管这个包被分到多少分,或者多少个线程同时接收,我们都有办法根据接收包的先后顺序和socket的连接id,将某个socket连接的某个包组成一个完整的包
比如为每个socket建一个缓冲区,收到该socket的不完整的包都放在这缓冲区里面,在根据包长来判定这个包是否完整
这个是你的设计问题,与iocp无关,其它模型也可以做成这样;至于如果判断数据接收完毕,与网络编译无关,更别说iocp了。那是你的业务逻辑。
你想像成网络编程为如下的样子:
一头不停的把数据放上传送带,一次可放任意数据;一头不停的从传送带上取出数据,一次同样可取任意数据(根据你的网络好坏,机器好坏等)。
2、接收数据需要分包处理,你也可以统一设置为固定长度的数据结构,就省去了分包的复杂,不足这处是会浪费网络带宽
3、消息包一般应该:标识+长度+消息实体
socket发送,有时不会一次把数据发完,我这里主要是想问的是:每次线程执行的时候,我是不是只用根据socket的值,依次取出相应socket对应的缓存数组,然后把数据依次的保存到该数组后面,这样接到的包中数据的顺序应该就是正确的顺序吧?!我这样测试过,貌似是正确的。
继续发问:如果即要处理分包问题,又要处理多个客户端socket的链接,这样的情况,应该需要处理多个线程和socket的同步和互斥操作,该如何做呢?