找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5272|回复: 2

send,ACE_Reactor以及handle_output的问题,n久都没搞明白

[复制链接]
发表于 2008-5-21 23:19:25 | 显示全部楼层 |阅读模式
其实我原来用过ACE_Reactor,感觉和select的用法没有太多本质区别,我只用一些基本功能。平台是windows。
但是,这几天重新使用ACE_Reactor,出了很多诡异的事情,搞了好久都不明白,发到版上问一问,看看哪位碰到过类似情况。
我其实就是使用send和WRITE_MASK,用非阻塞socket,将好几段大段数据块连续发送出去。本来感觉非常简单。
但是,我发现无论我一次send的内容(用的是ACE_SOCK_Stream的send)有多大(比如50MBytes),都能一次发送成功,send返回发送成功50MBytes,这个其实很奇怪,我发现好像windows又起了线程,不断发送。即使我迫使这个发送程序发送操作完毕以后,马上退出,windows仍然在不停的发送,而且另外的接收端也能正常接受,直到50M全部发送完。这个感觉很诡异,按照我原来的经验,应该只能发送一点点才对,然后监听可写消息(WRITE_MASK),不断send才对。
再说另外一面,由于我的程序发现我一次发送50M成功,所以会自动又发送接下来的50M,这回send会返回-1,errno是EWOULDBLOCK,这个感觉是对的,然后我马上register write_mask。但是程序马上进入handle_output,这个就不对了,因为我前一个50M还没有发送完毕,看看网卡的发送流量就知道了,但是却立刻进入handle_output。接下来,会执行handle_output里面的send,结果返回-1,errno是100014,也就是WSAEFAULT,非常奇怪
本来这么简单的事情,怎么感觉哪儿都不对呢?
谁遇到过这种情况?
 楼主| 发表于 2008-5-21 23:19:32 | 显示全部楼层
intersting, can you try send_n instead.
 楼主| 发表于 2008-5-21 23:19:41 | 显示全部楼层
我遇到的情况是,在我禁用了对端的网卡之后(禁用5分钟后自动启用网卡)较长一段时间内,本地的handle_output里调用的send_n还会返回成功,但不总是成功,不明白怎么回事,很郁闷。知道的来说说吧。学习了◎!!!~~
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-22 02:03 , Processed in 0.012538 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表