IOCP如何管理接收到的数据包呢?

hurryboylqs 2008-05-06 03:51:11
我开一个线程来GetQueuedCompletionStatus,客户端以固定大小包的形式向服务器发数据,由于TCP流的特性,一次OP_READ操作不保证将一个包接完,这样问题就来了,下次再接收怎么拼合成一个完整的包呢?大家讲下是怎么管理的,IOCP对我来说就是数据包管理这块有点问题.有个简单例子更好...
...全文
511 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
woshisaoge 2012-07-09
  • 打赏
  • 举报
回复
问一下,如果是有多个包都被拆分开了。如A、B两个包,分别被拆分成了A1、A2,B1、B2。如何判断A2、B2到底是属于从哪个包拆出来的呢?是不是需要在发送方拆包。
woshisaoge 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

找到了个比较好的代码,处理了只连接而不发数据的情况(恶意连接),多个线程同时GetQueuedCompletionStatus并能很好的
管理包顺序等问题,需要的可以发邮件给我(在上面写有)
[/Quote]

能不能给我发一份。最近涉及到IOCP这一块。数据管理还很欠缺,希望能启发下。谢谢。邮箱:571137631@qq.com
xjlzyi 2012-07-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

找到了个比较好的代码,处理了只连接而不发数据的情况(恶意连接),多个线程同时GetQueuedCompletionStatus并能很好的
管理包顺序等问题,需要的可以发邮件给我(在上面写有)
[/Quote]
能把管理数据包顺序的代码发我一份吗? 谢谢
邮箱37025130@qq.com
xumaojun 2010-07-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hurryboylqs 的回复:]
找到了个比较好的代码,处理了只连接而不发数据的情况(恶意连接),多个线程同时GetQueuedCompletionStatus并能很好的
管理包顺序等问题,需要的可以发邮件给我(在上面写有)
[/Quote]

能否分享一下你找到的可以处理恶意连接的代码,谢谢啦
我的邮箱 03xsxmj@163.com
僵哥 2008-05-08
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 hurryboylqs 的回复:]
我现在初步的做法是 客户端采取主动形式,客户端每收个包前都要发一个命令给服务器端(命令里面包含文件索引位置,准备传输的文件数据长度),服务器收到命令后再读取文件后用WSASend投递一个包(包里包含文件数据在文件中的索引位置就是哪个文件指针位置,和将要发送的数据长度),这样客户端能很好的控制所需要的数据,不知道该做法是否有效率,还没试呢...
[/Quote]
这个不好怎么说,如果这个时候客户端把文件的Position置为0,数据长度置为文件长度(如果已经知道的话),那么就...
hurryboylqs 2008-05-08
  • 打赏
  • 举报
回复
我现在初步的做法是 客户端采取主动形式,客户端每收个包前都要发一个命令给服务器端(命令里面包含文件索引位置,准备传输的文件数据长度),服务器收到命令后再读取文件后用WSASend投递一个包(包里包含文件数据在文件中的索引位置就是哪个文件指针位置,和将要发送的数据长度),这样客户端能很好的控制所需要的数据,不知道该做法是否有效率,还没试呢...
僵哥 2008-05-08
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 hurryboylqs 的回复:]
还有个问题,200分得不到答案不甘心啊,呵呵

上面的拆包问题基本解决了,还有个问题就是:我现在N个客户端连接服务器,服务器端用IOCP接受连接
由于服务器需要传文件给每个客户,当用户发出开始传输文件的命令时就可以开始传输了,中途可以由客户端发命令控制暂停传输,停止传输等操作,这个过程应该怎样管理才更方便的呢?
[/Quote]
重叠I/O是允许在发送过程当中接收的,同样的,也允许在接收过程当中发送,只要发送的时候不是一次性把一整个文件压上去(其实也没这个必要),只要有稍许的分块,只要这个控制命令在后续发块发出之前到达,那么服务器就可以暂停,或者中断文件的传输.建议的是,文件块当中也跟普通的命令一样格式,这样子客户端发发送了相应的控制命令之后还可以收到一个回执.
hurryboylqs 2008-05-08
  • 打赏
  • 举报
回复
还有个问题,200分得不到答案不甘心啊,呵呵

上面的拆包问题基本解决了,还有个问题就是:我现在N个客户端连接服务器,服务器端用IOCP接受连接
由于服务器需要传文件给每个客户,当用户发出开始传输文件的命令时就可以开始传输了,中途可以由客户端发命令控制暂停传输,停止传输等操作,这个过程应该怎样管理才更方便的呢?
僵哥 2008-05-08
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 annvily 的回复:]
不同意20楼
你应该是在发送缓冲足够的情况下测的吧
你有试过发送缓冲满之后再发送数据么

还有,就算发送出去了,接收方也不是都接收到,也有接收缓冲的问题
不然TCP也不要解决粘包什么的
[/Quote]
建议做一个测试先,谢谢
annvily 2008-05-08
  • 打赏
  • 举报
回复
不同意20楼
你应该是在发送缓冲足够的情况下测的吧
你有试过发送缓冲满之后再发送数据么

还有,就算发送出去了,接收方也不是都接收到,也有接收缓冲的问题
不然TCP也不要解决粘包什么的
Torch009 2008-05-08
  • 打赏
  • 举报
回复
帮你顶
hurryboylqs 2008-05-07
  • 打赏
  • 举报
回复
找到了个比较好的代码,处理了只连接而不发数据的情况(恶意连接),多个线程同时GetQueuedCompletionStatus并能很好的
管理包顺序等问题,需要的可以发邮件给我(在上面写有)
hurryboylqs 2008-05-07
  • 打赏
  • 举报
回复
按Platform SDK的写法,应该是并不一定,但是基本上可以认定其是有保障的.
--------------------
恩,测试了下,每次WSASend投递的包,都能在一个OP_WRITE发生时一个不少的给发出去了(内网公网都测试过)
僵哥 2008-05-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hurryboylqs 的回复:]
一个Socket保持只有一个未决的RECV,顺序不考虑.
----------------
恩,这个能解决包顺序问题,但组包解析还得一堆,同时这个做法也不符合IOCP的初衷,体现不到IOCP的优越性了


你首先要明白,完成端口是同步的。
----------------
嘿嘿,但是在多线程的情况下就有些不妙了,发觉IOCP管理多客户端实在是有点麻烦,不知道那位能讲解下IOCP在接收和发送方面的经验
[/Quote]
这个不叫做组包,而叫做拆包,从一个流当中将包一个个拆解出来,比较众多的做法就是在包的前方增加一个固定长度的数据表示包的长度(这个固定长度可能还有其它验证标识等等).

当你理解并能够熟练应用之后(解决了所有多线程所带来的麻烦,特别是访问冲突等),你会发现这还是一个相当好的模式,不仅有线程池还有队列...
Eleven 2008-05-07
  • 打赏
  • 举报
回复
UP
Eleven 2008-05-07
  • 打赏
  • 举报
回复
UPQ
僵哥 2008-05-07
  • 打赏
  • 举报
回复
按Platform SDK的写法,应该是并不一定,但是基本上可以认定其是有保障的.
qdajie 2008-05-07
  • 打赏
  • 举报
回复
1\近保留一个未决的recv,当返回时马上继续投递一个新的,然后处理接受到的数据;
2、在每个perhandledata中维护一个recv队列,先进先出,这样可以1次投递多个recv同时可以保证接受次序正确,也就是当队首返回时处理数据,当然要处理数据时可能已经返回了多个,返回多少继续投递多少
hurryboylqs 2008-05-07
  • 打赏
  • 举报
回复
问一下,WSASend投递的包,假设长度为n,当一个OP_WRITE事件发生时,windows一定能保证帮我们都传给对方了吗(至少复制到了发送缓冲区)?
annvily 2008-05-07
  • 打赏
  • 举报
回复
自定义头部
获取到本次数据长度
memmove移动到下一个有效数据位
加载更多回复(11)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧