+ -
当前位置:首页 → 问答吧 → boost.asio是搞笑来的?

boost.asio是搞笑来的?

时间:2011-12-06

来源:互联网

不说了,官方example\echo\async_tcp_echo_server.cpp
开2个客户端用telnet方式连上echo_server,长时间后关掉telnet后,echo_server竟然不会断开客户端?
而且在echo_server的机器上用netstat -ano -p tcp查看,服务端于客户端的连接还处于ESTABLISHED状态,这就是所谓的终极网络库?搞笑的吧!

用asio到商业项目的大牛来解释下?

作者: pker911   发布时间: 2011-12-06

本来想学习学习asio的,就这么个样子,我看是不是网上吹的人太多了?
尼玛我客户端机器telnet都关掉了,服务端上竟然还是ESTABLISHED状态,无敌的asio。。。

作者: pker911   发布时间: 2011-12-06

呵呵,别管什么库,掌握“机制”是最重要的。

如果因为存在某个库,而使你丧失了学习此技术之内部机制的可能,那么,我劝你还是不要先使用这个库为好。

就像这个asio,如果因为它的存在,而令你不再学习异步重叠I/O,那么,还是先不要使用这个库为好。

作者: sinservice   发布时间: 2011-12-06

难道asio只有在handle_read/handle_write的时候出现error_code才知道客户端已经断开吗?
就像我telnet测试一样,客户端不write,难道asio就没办法返回客户端断开了?
连底层onclose()都不提供,你说学习啥呢?为了学哪些晦涩难懂的所谓func/bind吗?
自己运行下async_tcp_echo_server.cpp测试下再来喷可行?

作者: pker911   发布时间: 2011-12-06

引用 3 楼 pker911 的回复:

难道asio只有在handle_read/handle_write的时候出现error_code才知道客户端已经断开吗?
就像我telnet测试一样,客户端不write,难道asio就没办法返回客户端断开了?
连底层onclose()都不提供,你说学习啥呢?为了学哪些晦涩难懂的所谓func/bind吗?
自己运行下async_tcp_echo_server.cpp测试下再来喷可行?


asio当然在机制仅会支持TCP或UDP支持的feature,而TCP保活超时是半个小时以上,半个小时(或45分钟)后会产生一个“网络错误”,那个时候就asio就会给客户事件了。

如果要建立商业级的服务器软件,仅仅依赖“传输层”的feature是远远不够的,你要自己做心跳来保活。

作者: sinservice   发布时间: 2011-12-06

长连接服务器需要做心跳,在“问答式服务器”里做定时器就可以了。

当你收到一个包,就对这个socket开始计时,如果再收到包就重新计时,如果超时,就自己产生一个事件以关掉socket。


作者: sinservice   发布时间: 2011-12-06

ok,如果说asio建立在tcp协议栈上,那么保活超时之后,也要给调用者返回所谓的“网络错误”,事实上是并无任何返回(handle_read未触发),还是麻烦LS的兄台自己跑一下example那个例子,再来解答,哦可?

不要跟我讲应用层面要保证的机制,写server都会这样处理,现在问题关键是底层的所谓"终极神器"的asio,在socket keeplive超时后,并无任何异常触发并返回,你可明白?

作者: pker911   发布时间: 2011-12-06

引用 6 楼 pker911 的回复:

ok,如果说asio建立在tcp协议栈上,那么保活超时之后,也要给调用者返回所谓的“网络错误”,事实上是并无任何返回(handle_read未触发),还是麻烦LS的兄台自己跑一下example那个例子,再来解答,哦可?

不要跟我讲应用层面要保证的机制,写server都会这样处理,现在问题关键是底层的所谓"终极神器"的asio,在socket keeplive超时后,并无任何异常触发并返回,……


你等了多长时间?

作者: sinservice   发布时间: 2011-12-06

昨天晚上在公网机器上跑的server,然后在另外2个公网机器上开的telnet客户端,今天早上发现连接都没断很正常,然后把2个telnet关掉后,server没有任何hand_read()调用,无error_code,在netstat -ano -p tcp里面,还显示与2个telnet的连接处于ESTABLISHED已连接状态,其他的话我也不想多说了,谁不相信谁自己试下就知道了,无奈的asio,连最基本的保活机制都没检测。

作者: pker911   发布时间: 2011-12-06

server用的官方example代码,无任何改动。
我相信select/iocp都不可能出现这么低级的问题(同样的方法测试过)

作者: pker911   发布时间: 2011-12-06

引用 8 楼 pker911 的回复:

昨天晚上在公网机器上跑的server,然后在另外2个公网机器上开的telnet客户端,今天早上发现连接都没断很正常,然后把2个telnet关掉后,server没有任何hand_read()调用,无error_code,在netstat -ano -p tcp里面,还显示与2个telnet的连接处于ESTABLISHED已连接状态,其他的话我也不想多说了,谁不相信谁自己试下就知道了,无奈的asio……


“在netstat -ano -p tcp里面,还显示与2个telnet的连接处于ESTABLISHED已连接状态”,

呵呵,你想想看。 tcp协议栈认为这两个连接依然是ESTABLISHED,这跟asio有什么关系呢?

作者: sinservice   发布时间: 2011-12-06

引用 9 楼 pker911 的回复:

server用的官方example代码,无任何改动。
我相信select/iocp都不可能出现这么低级的问题(同样的方法测试过)


select / iocp不用你本机的tcp协议栈吗?  
ESTABLISHED状态是协议栈决定的,还是asio抑或iocp决定的?

作者: sinservice   发布时间: 2011-12-06