IOCP WSASend成功,但是GQCS没有返回这个pending io!!!!

20 views
Skip to first unread message

mana

unread,
Aug 30, 2008, 3:25:12 AM8/30/08
to 高性能网络编程邮件列表
如题,对WSASend/WSARecv成功投递计数,对GQCS返回(无论成功与否)计数,凡是发现偶尔
GQCS的计数要少一点,分别对WSASend/WSARecv分别计数,发现都是偶尔WSASend投递的pending io没有被GQCS取回,
我的资源释放使用的引用计数,这样导致我的有些资源不能释放啊,老是等待那个没有返回的WSASend投递成功的pending io.
到底这两个计数是不是相等的啊?只要投递成功了GQCS是不是一定会返回?微软哪里有这个的明确说明没有呢?拜托各位了 :-)

关中刀客

unread,
Aug 30, 2008, 5:32:22 AM8/30/08
to 高性能网络编程邮件列表
我的做法,缓冲起来,集体发送

尚鹏飞

unread,
Aug 30, 2008, 10:31:08 PM8/30/08
to dev4s...@googlegroups.com
在WSASend处判断IO_PENDING意味这这个包正在等待队列中,当调用GQCS时得到的是处理包的结果,有可能是IO_PENDING(说明该包还在等待队列中)也有可能是SUCCESS(说明处理成功)。我的做法是:没使用引用计数,只在投递处申请内存,在完成处释放内存,我并不关心这个包被IO_PENDING了几次,只要投递和发送完成处对内存的操作是成对的就行。
以上情况是建立在整个过程都没有出错的情况,如果出现出错就应该加上相应的出错处理。
 
在08-8-30,关中刀客 <guanzho...@gmail.com> 写道:

huzhang...@gmail.com

unread,
Aug 31, 2008, 3:24:38 AM8/31/08
to 高性能网络编程邮件列表
如果是服务器,应该考虑内存池的模型,不要频繁的释放以及申请

On 8月31日, 上午10时31分, "尚鹏飞" <shangpf...@gmail.com> wrote:
> 在WSASend处判断IO_PENDING意味这这个包正在等待队列中,当调用GQCS时得到的是处理包的结果,有可能是IO_PENDING(说明该包还在-等待队列中)也有可能是SUCCESS(说明处理成功)。我的做法是:没使用引用计数,只在投递处申请内存,在完成处释放内存,我并不关心这个包被IO_PEN-DING了几次,只要投递和发送完成处对内存的操作是成对的就行。
> 以上情况是建立在整个过程都没有出错的情况,如果出现出错就应该加上相应的出错处理。
>
> 在08-8-30,关中刀客 <guanzhongda...@gmail.com> 写道:
>
>
>
>
>
> > 我的做法,缓冲起来,集体发送
>
> > On 8月30日, 下午3时25分, mana <kedin...@gmail.com> wrote:
> > > 如题,对WSASend/WSARecv成功投递计数,对GQCS返回(无论成功与否)计数,凡是发现偶尔
> > > GQCS的计数要少一点,分别对WSASend/WSARecv分别计数,发现都是偶尔WSASend投递的pending io没有被GQCS取回,
> > > 我的资源释放使用的引用计数,这样导致我的有些资源不能释放啊,老是等待那个没有返回的WSASend投递成功的pending io.
> > > 到底这两个计数是不是相等的啊?只要投递成功了GQCS是不是一定会返回?微软哪里有这个的明确说明没有呢?拜托各位了 :-)- 隐藏被引用文字 -
>
> - 显示引用的文字 -

水的影子

unread,
Aug 31, 2008, 11:09:18 PM8/31/08
to 高性能网络编程邮件列表
我也再做这方面的工作,发现数量是对的上的。每次异步io成功,我都会加1。你所谓的发送成功是指WSASend返回什么的情况?
异步操作的时候,判断错误的地方会比较多一点,你稍有什么地方多加一个,或者少减一个就会对不上的。
ps:没太看明白你的问题,大概猜测了下你的意思,行文可否再流畅点?

On 8月30日, 下午3时25分, mana <kedin...@gmail.com> wrote:

mana

unread,
Sep 1, 2008, 12:42:05 AM9/1/08
to 高性能网络编程邮件列表
多谢各位啦,这两天搬家,没来得及上来看 :-)

问题是如果计数不统一,那岂不是会导致内存泄漏,投递那块就丢失了哦。

代码上,错误处理,异常处理上应该都没有问题的,我也还是看过比较多iocp的代码,哈哈。

------------------------------

guard g(lock);
{
++pending;
if (SOCK_ERROR == WSASend/WSARecv && WSAGetLastError() !=
WSA_IO_PENDIGN)
--pending;
}

--------------------------------

GQCS(...)无论返回值是什么
{
guard g(lock);
--pending;
}
----------------------------------

然后当所有连接都关闭了,pending有可能>0,我分别对WSASend/WSARecv的pendingio计数,都是WSASend的没返
回。

我的是用压力测试发现的,一般压一两个小时就出现,pending数目有大有小,一般有1-4个左右,我是400个连接压,不停的断开,连接,发包。

水的影子

unread,
Sep 1, 2008, 3:50:03 AM9/1/08
to 高性能网络编程邮件列表
你的guard g(lock);函数里
if (SOCK_ERROR == WSASend/WSARecv && WSAGetLastError() !=
WSA_IO_PENDIGN)
--pending;
然后GQCS(...)里--pending;
是不是有时候会减2次?

mana

unread,
Sep 2, 2008, 1:48:02 AM9/2/08
to 高性能网络编程邮件列表
不会啊,返回非io_pending的错误,表示没有投递成功,没到iocp的队列,所以GQCT应该不会有跟这个投递相关的返回。

coffee needs learning more

unread,
Oct 9, 2008, 3:12:55 AM10/9/08
to 高性能网络编程邮件列表
流量压力大或者运行时间长都会产生这个问题,资源会有泄漏,这个是iocp本身的问题,计数没有记错,我测试过,这个泄漏虽然会积累,但是可以承受

On 8月30日, 下午3时25分, mana <kedin...@gmail.com> wrote:

zcpro

unread,
Oct 9, 2008, 3:49:58 AM10/9/08
to 高性能网络编程邮件列表
iocp中,连接关闭的通知不一定是最后一个通知,wsasend等其它io有可能在收到关闭通知后才返回。你说的现象估计是这个问题引起的。

On 9月1日, 下午12时42分, mana <kedin...@gmail.com> wrote:
Reply all
Reply to author
Forward
0 new messages