程序员linux c/c++杂谈我用 Linux

优雅关闭以及如何检测对端已经关闭

2019-06-26  本文已影响6人  cpp加油站

1. 什么是优雅关闭

2. 如何优雅关闭

2.1 使用shutdown函数

2.1.1 shutdown函数定义

#include <sys/socket.h>
int shutdown(int s, int how);

how有三种选项,如下:

返回值:

返回-1时errno值如下:

2.1.2 使用shutdown

接上面第一种情况,其实要让服务端接收到EOF很简单,我们需要使用如下代码:

shutdown(s, SHUT_WR); //就是说不会再有人往s上写数据了,那么服务端读取时自然就会读到EOF

2.1.3 shutdown和close区别

注意:showdown后仍然要调用close关闭socket

2.2 使用so_linger

2.2.1 代码例子

struct linger ling;
ling.l_onoff = 1;
ling.l_linger = 0;
setsockopt(fd, SOL_SOCKET, SO_LINGER, (char*)&ling, sizeof(ling));
close(fd);

结构体struct linger如下:
struct linger{
int l_onoff;
int l_linger;
};
有以下三种设置情况:

注意:内核拖延的时间取决于l_linger的值,阻塞时间超过该值就会发生超时

3. 如何检测对端已经关闭

本人在简书上写的内容均为本人原创,转载需经本人同意,欢迎转载分享,请注明出处。简书主页:https://www.jianshu.com/u/e8c7bb5e3257

上一篇下一篇

猜你喜欢

热点阅读