IOCP中,有可能出现数据包发送完成,但并不返回的情况不?

ERR0RC0DE 2006-12-31 01:43:03
即: WSASend发完数据包后,但工作线程在GetQueuedCompletionStatus并无返回.

出现这情况的话,那就是不断send, 就是内存不断增加(GetQueued对于send的内存块检测不出,无法free那块内存块),一直到SERVER死机.

我是拿MS的例子IOCPServer作测试的.
自己写了个简单的Client,一个线程处理一个连接,然后每隔N毫秒发一个包,当M个线程起来后,大概10分钟不到,IOCPSERVER就挂了.

M=100
N=5

有没有做过这样的测试?
...全文
175 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ProgrameMan 2007-01-01
  • 打赏
  • 举报
回复
每遇到过这种情况? 另外你说WSASend发完数据包后,但工作线程在GetQueuedCompletionStatus并无返回.

你是怎么确定WSASend 发送完毕的?
ERR0RC0DE 2007-01-01
  • 打赏
  • 举报
回复
特别是M=200的时候,很明显,一两分钟,内存就涨起来了.

我写的时候,是按需分配,写了个简单的内存池管理,send/recv的时候,分配,GetQueue后,回收.思路基本这样.

各位可以试试.不知道是自己写的问题还是本身框架处理有问题.

IOCPSERVER的处理过程就是: 收包后直接再转回给client
Client的处理过程: 每隔N毫秒就发,并统计收回的包(现每个包大概是:26字节)

ERR0RC0DE 2007-01-01
  • 打赏
  • 举报
回复
很简单啊,SERVER是简单的将CLIENT的信息收到后,转回来.
只要在CLIENT判断发包数和收包数一致否,就可以判断是否发送完毕.

而CLIENT测试过程中,RECV/SEND包的数量是一样,而SERVER不断增加的内存就是有问题,找了一堆的问题,我想应该是这个地方出现的.

然后在SERVER另启一线程进行检查(WSAGetOverlappedResult)数据包的,完成则PostQueue,还是如此.
如果将未完成例程的内存块强行PostQueue,我觉得有问题,好像也不对吧...

18,356

社区成员

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

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