IOCP几点疑惑

lijianli9 2010-04-19 03:37:05
1:handio中的buffersize定义为多大比较好,我的网络模块传输中传输的数据大的时候可以达到500K
2:wsarecv提交一次请求,比如请求 20 个长度字段,但是网络系统缓冲区中有50个长度的数据,会怎么样?
3:wsarecv提交一次请求,比如请求 50 个长度字段,但是返回的时候只获取了20个该怎么操作?或者说客户端刚好发送了20个,客户端是阻塞型的发送的。
4:IOCP中是否需要自己的封包操作,先提交一个包头的wsarecv请求,返回后再按包头中的length字段再次提交对包内容的请求?
5:如果再加上心跳包的请求?会不会要提交多个未决的io请求。
6:我服务器获取的包要提交给上端处理,但是获取的包不一定是一个完整的包,请问是否需要将包缓存起来,等获取到一个完整的包后再postmessage给window处理,请问使用哪种比较好的缓存技术,不需要太多的内存工作?
...全文
131 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
buptzwp 2010-04-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 whs1980 的回复:]
3:wsarecv提交一次请求,比如请求 50 个长度字段,但是返回的时候只获取了20个该怎么操作?或者说客户端刚好发送了20个,客户端是阻塞型的发送的。
服务器还会继续等待剩余的30个字节的内容.这种情况下,应该先送每次要发送的长度给服务器,服务器只接受对应大小的内容.

[/Quote]
对这个有点疑惑,我试过,服务器投递一个10000字节的WSARecv()请求,客户端发送500字节的数据量,服务器还是会正常返回呀。
King030609 2010-04-20
  • 打赏
  • 举报
回复
回帖能得分?
yhlovehx 2010-04-20
  • 打赏
  • 举报
回复
1:handio中的buffersize定义为多大比较好,我的网络模块传输中传输的数据大的时候可以达到500K
最好是系统页面的倍数
2.wsarecv提交一次请求,比如请求 20 个长度字段,但是网络系统缓冲区中有50个长度的数据,会怎么样?
从系统缓冲区读取20个长度,系统缓冲区还有30个
3:wsarecv提交一次请求,比如请求 50 个长度字段,但是返回的时候只获取了20个该怎么操作?或者说客户端刚好发送了20个,客户端是阻塞型的发送的。
这个看你的具体数据是怎么组织的了 理论上服务端是不能阻塞在哪里接收指定长度的数据的 把接收的数据保存起来 对那些数据断断续续的客户端可以直接干掉的

4:IOCP中是否需要自己的封包操作,先提交一个包头的wsarecv请求,返回后再按包头中的length字段再次提交对包内容的请求?
需要的 因为TCP会粘包 但是不是是你这种方式 应该协商一个最大包的长度 以 datalen : data的格式
一次投递一个 sizoef(datalen)+MAX datalen 长度的wsarecv操作就行 然后自己根据格式来判断是否是一个完整的包

5.如果再加上心跳包的请求?会不会要提交多个未决的io请求
普通的数据收发操作 不会有什么影响
我服务器获取的包要提交给上端处理,但是获取的包不一定是一个完整的包,请问是否需要将包缓存起来,等获取到一个完整的包后再postmessage给window处理,请问使用哪种比较好的缓存技术,不需要太多的内存工作?

参照第 4条


Sou2012 2010-04-20
  • 打赏
  • 举报
回复
楼主打个字能不能把大小写打出来呀?

BufferSize 最好是页大小。
天山游龙 2010-04-20
  • 打赏
  • 举报
回复
whs1980说的基本很清楚了。
其实要比较好控制,就是要定义包头和包体,包头固定大小(里面包括包体长度字段)。在接收或者发送的时候,可以根据实际发送或接收字节调整缓冲区指针,知道全部接收或发送!
比如说
char* szBuf;
nBufLen;
PerIoContext->wsabuf.buf=szBuf;
PerIoContext->wsabuf.len=nBufLen;

在等待完成端口时,有个参数是dwNumbers代表实际发送字节数
当dwNumbers < PerIoContext->wsabuf.len时,可以这样
PerIoContext->wsabuf.buf=PerIoContext->wsabuf.buf+dwNumbers;
PerIoContext->wsabuf.len=nBufLen-dwNumbers;
继续投递请求,直到dwNumbers == PerIoContext->wsabuf.len表示全部完成



whs1980 2010-04-19
  • 打赏
  • 举报
回复
1:handio中的buffersize定义为多大比较好,我的网络模块传输中传输的数据大的时候可以达到500K
这个可以由底层自动去调整,可以在程序中发送可变长度的数据.
2:wsarecv提交一次请求,比如请求 20 个长度字段,但是网络系统缓冲区中有50个长度的数据,会怎么样?
会在有20个字节时返回
3:wsarecv提交一次请求,比如请求 50 个长度字段,但是返回的时候只获取了20个该怎么操作?或者说客户端刚好发送了20个,客户端是阻塞型的发送的。
服务器还会继续等待剩余的30个字节的内容.这种情况下,应该先送每次要发送的长度给服务器,服务器只接受对应大小的内容.

4:IOCP中是否需要自己的封包操作,先提交一个包头的wsarecv请求,返回后再按包头中的length字段再次提交对包内容的请求?
对,这也可以看作是你自己的协议信息,正好解决第三点中的问题

5:如果再加上心跳包的请求?会不会要提交多个未决的io请求。
心跳也是客户和服务器端的一次信息交互,只要对等处理,应该不会有问题.
6:我服务器获取的包要提交给上端处理,但是获取的包不一定是一个完整的包,请问是否需要将包缓存起来,等获取到一个完整的包后再postmessage给window处理,请问使用哪种比较好的缓存技术,不需要太多的内存工作?
需要缓存,看你的情况,如果这种情况不多,可以用到再申请,如果情况很多,可以申请一块内存(要估计是你用到的最大尺寸的内存),一直使用该内存.这样就不会重复申请,造成内存碎片.
百事烟 2010-04-19
  • 打赏
  • 举报
回复
buffersize的大小和网络环境有关,和你的数据关系不大,网络好可以大一些

其它问题都是接收和数据处理之间的协调问题,接收和处理一定要分离,越彻底越好,接收是否完整是通过自定义协议(包头)实现的,接收过程中就能确定是否数据完整,接收1次完整的包后,交给处理模块,如果处理过程中有耗时操作,还会有copy数据,新开线程

如果客户数量不是特别大,传输的内容不是特别多,完全可以不用iocp
soswaidao 2010-04-19
  • 打赏
  • 举报
回复
友情帮顶,友情帮顶

18,356

社区成员

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

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