socket 如何确认对端已经close
最近纠结于两个小问题,哪位大牛帮忙解答一下,不胜感激1.客户端给服务端发送消息,一端时间后服务端执行了close操作,请问此时客户端如何检测到这一事件? 如果检测不到,再一次发送时会触发broken pipe信号
2.在linux端进行服务开发时,一般会用top查看占用的资源,不知各位一般习惯看哪几个字段?我一般看cpu、mem、swap。VIRT那个字段有参考必要吗? 这个要看网络方面的专家来解答了,
话说如果突然失去通信的这种,你也没办法,网络如果又恢复了呢??我随便说说的 本帖最后由 lxyscls 于 2016-08-19 22:09 编辑
回复 1# kaede_1
讲错,看来还是select(read) -> read = 0 -> close 回复 3# lxyscls
write=-1 是嘛意思?我这边测试,第一次client send之后,服务端接收后close,client端接下来在尝试去发送,但是此时服务端已经接收不到信息,再一次发送时触发了signal broken pipe。
我想问的就是,在服务端关闭之后,client端如何检测到这一事件。 看了好几个网络库 都是通过 read() == 0 来判定连接断开的 read write 返回值 + 心跳超时
有些时候,比如对方突然断电,进电梯信号没了,尤其移动端,这些情况很常见,这些场景,只能心跳超时来判断 本帖最后由 lxyscls 于 2016-08-19 22:10 编辑
回复 4# kaede_1
恩,select读事件吧,读事件里面read = 0 close(fd)
看了一下broken pipe的原因,记得是write两次,第二次fd已经收到rst,前面通过write=-1判断不对
http://linkyou.blog.51cto.com/1332494/751877 各位大牛,我指的是发送,而不是读取。因此凭借read返回值为0来判断是不行的
而且本地试过,服务端关闭连接后,客户端第一次send的返回值是正常的,因此此时也不能通过send的返回值来判断。
在网上查过,可以通过select和epoll来监测rst信号,但是对于仅发送数据的客户端来说又有点繁重。
想请教大牛们有没有什么好方法,多谢! 本帖最后由 wlmqgzm 于 2016-08-23 12:09 编辑
//我的检测socket_closed的代码
boolAsio_tcp_socket::find_socket_closed( boost::asio::ip::tcp::socket &socket1, int int_socket_handle_init )
{
int int_socket_handle = socket1.native_handle();
if( int_socket_handle <= 0 ) {
if( g_message_out_level>=5 )log_message_int( "find socket closed. socket_init",int_socket_handle_init );
return true;
}
struct tcp_info info;
int length = sizeof(info);
memset( &info,0,sizeof(info) );
getsockopt( int_socket_handle, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&length );
if( info.tcpi_state == 1 ) return false;
if( g_message_out_level >=5 ) log_message_int( "find socket closed. socket_init",int_socket_handle_init );
return true;
} 回复 9# wlmqgzm
你这个是主动确认,楼主的情况总不能write一下确认一次吧
页:
[1]
2