社区
网络编程
帖子详情
IOCP如何管理接收到的数据包呢?
hurryboylqs
2008-05-06 03:51:11
我开一个线程来GetQueuedCompletionStatus,客户端以固定大小包的形式向服务器发数据,由于TCP流的特性,一次OP_READ操作不保证将一个包接完,这样问题就来了,下次再接收怎么拼合成一个完整的包呢?大家讲下是怎么管理的,IOCP对我来说就是数据包管理这块有点问题.有个简单例子更好...
...全文
511
31
打赏
收藏
IOCP如何管理接收到的数据包呢?
我开一个线程来GetQueuedCompletionStatus,客户端以固定大小包的形式向服务器发数据,由于TCP流的特性,一次OP_READ操作不保证将一个包接完,这样问题就来了,下次再接收怎么拼合成一个完整的包呢?大家讲下是怎么管理的,IOCP对我来说就是数据包管理这块有点问题.有个简单例子更好...
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
IOC
P服务器收发、处理
数据包
的简单框架
这是windows上实现的
IOC
P
接收
、处理和发送
数据包
的一个简单通用的框架,新建一个空项目,全部文件导入进去编译即可(需要win7及以上系统);程序比较简洁,很好理解,希望对初学者有一定的帮助。
ioc
p服务器客户端混合框架
//连接远程服务器成功 或
接收
到一个远程连接时,本函数将会被
ioc
.dll回调.在本函数中,应该向客户端列表中添加节点,记得加锁 // //2.s :套接字句柄,标志着一个新的连接 //3.u_addr:对端的IP地址,网络字节序 //4.u_...
c++高并发商业级游戏服务器干货【客户端ue4和unity3d】
3、服务器底层封装没有使用任何第三方网络库以及任何第三方插件,自由度非常的高,出了任何BUG,你都有办法去修改,查找问题也非常方便,在windows下使用
ioc
p,linux下使用epoll. 4、讲解c++纯客户端,主要用于...
IOC
P_API(2009/7/14)
2.修改了
IOC
PServer和
IOC
PClient中的Send函数,以及
接收
处理流程,可以收发大
数据包
(具体查看函数说明);3.增加了实现RUDP协议的函数(只实现了可靠传输,没有实现流控和拥控);4.修改完成时间2009年7月14日
可扩展多线程异步Socket服务器框架EMTASS 2.0
在程序设计与实际应用中,Socket
数据包
接收
服务器够得上一个经典问题了:需要计算机与网络编程知识(主要是Socket),与业务处理逻辑密切(如:包组成规则),同时还要兼顾系统运行的稳定、效率、安全与
管理
等。...
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章