SO_LINGER套接字选项
本选项指定close函数对面向连接的协议如何操作。默认操作是close连接时,将残留在套接字缓冲区的数据尝试发送给对端。 该选项向内核传递结构:
struct linger {
int l_onoff;
int l_linger;
};
1、当l_onoff为非0值,l_linger为0时,TCP将丢弃套接字缓冲区中的数据,并发送RST给对端。这样可以避免TIME_WAIT状态。这样其实不好,TIME_WAIT状态让旧的重复分节在网络中消失,避免化身。 2、当l_onoff和l_linger都不为0时,进程会睡眠直至所有数据都发送且被对方确认或延滞时间到。(如果套接字被设置为非阻塞,则套接字不等待close完成)。设置后,close的返回表明发送的数据和FIN已由对方TCP确认。
void setLinger() {
int fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct linger Linger;
Linger.l_onoff = 1;
Linger.l_linger = 10;
setsockopt(fd, SOL_SOCKET, SO_LINGER, &Linger, sizeof(Linger));
}
SO_REUSEADDR
该选项允许重用本地地址: 1、监听服务器捆绑众所周知端口,即使之前建立的改端口连接仍然存在。(重启服务器时不必等待TIME_WAIT状态结束就能进行重启) 2、允许同一端口启动多个同一服务器实例,只要每个实例捆绑不同本地IP。
void setReuseAddr(int fd) {
int on = 1;
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
}
TCP_NODELAY
该选项将关闭TCP的Nagle算法。Nagle算法不会立即将小分组(小于MSS的分组)立即发出,而是凑成一个大分组再一并发出,这样能够减少TCP头部开销,但也不可避免地产生延时。
void setNodelay(int fd) {
int disable = 1;
setsockopt(fd, IPPROTP_TCP, TCP_NODELAY, (void *)&enable, sizeof(enable));
}
|