kaede_1 发表于 2016-08-19 15:10

socket 如何确认对端已经close

最近纠结于两个小问题,哪位大牛帮忙解答一下,不胜感激
1.客户端给服务端发送消息,一端时间后服务端执行了close操作,请问此时客户端如何检测到这一事件? 如果检测不到,再一次发送时会触发broken pipe信号
2.在linux端进行服务开发时,一般会用top查看占用的资源,不知各位一般习惯看哪几个字段?我一般看cpu、mem、swap。VIRT那个字段有参考必要吗?

shang2010 发表于 2016-08-19 15:21

这个要看网络方面的专家来解答了,

话说如果突然失去通信的这种,你也没办法,网络如果又恢复了呢??我随便说说的

lxyscls 发表于 2016-08-19 15:55

本帖最后由 lxyscls 于 2016-08-19 22:09 编辑

回复 1# kaede_1


    讲错,看来还是select(read) -> read = 0 -> close

kaede_1 发表于 2016-08-19 16:52

回复 3# lxyscls


    write=-1 是嘛意思?我这边测试,第一次client send之后,服务端接收后close,client端接下来在尝试去发送,但是此时服务端已经接收不到信息,再一次发送时触发了signal broken pipe。
    我想问的就是,在服务端关闭之后,client端如何检测到这一事件。

evaspring 发表于 2016-08-19 17:16

看了好几个网络库 都是通过 read() == 0 来判定连接断开的

cokeboL 发表于 2016-08-19 17:23

read write 返回值 + 心跳超时

有些时候,比如对方突然断电,进电梯信号没了,尤其移动端,这些情况很常见,这些场景,只能心跳超时来判断

lxyscls 发表于 2016-08-19 22:05

本帖最后由 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

kaede_1 发表于 2016-08-22 11:00

各位大牛,我指的是发送,而不是读取。因此凭借read返回值为0来判断是不行的

而且本地试过,服务端关闭连接后,客户端第一次send的返回值是正常的,因此此时也不能通过send的返回值来判断。

在网上查过,可以通过select和epoll来监测rst信号,但是对于仅发送数据的客户端来说又有点繁重。

想请教大牛们有没有什么好方法,多谢!

wlmqgzm 发表于 2016-08-23 11:59

本帖最后由 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;
}

lxyscls 发表于 2016-08-24 09:06

回复 9# wlmqgzm


你这个是主动确认,楼主的情况总不能write一下确认一次吧
页: [1] 2
查看完整版本: socket 如何确认对端已经close