SO_KEEPALIVE 保持连接检测对方主机是否崩溃,避免(服务器)永远阻塞于TCP连接的输入。设置该选项后,如果2小时内在此套接口的任一方向都没有数据交换,TCP就自动给对方 发一个保持存活探测分节(keepalive probe)。这是一个对方必须响应的TCP分节.它会导致以下三种情况:对方接收一切正常:以期望的ACK响应。2小时后,TCP将发出另一个探测分节。对方已崩溃且已重新启动:以RST响应。套接口的待处理错误被置为ECONNRESET,套接 口本身则被关闭。对方无任何响应:源自berkeley的TCP发送另外8个探测分节,相隔75秒一个,试图得到一个响应。在发出第一个探测分节11分钟15秒后若仍无响应就放弃。套接口的待处理错误被置为ETIMEOUT,套接口本身则被关闭。如ICMP错误是“host unreachable(主机不可达)”,说明对方主机并没有崩溃,但是不可达,这种情况下待处理错误被置为 EHOSTUNREACH。
在该书的第158页有更详细的描述。
根据上面的介绍我们可以知道对端以一种非优雅的方式断开连接的时候,我们可以设置SO_KEEPALIVE属性使得我们在2小时以后发现对方的TCP连接是否依然存在。
keepAlive = 1;
Setsockopt(listenfd, SOL_SOCKET, SO_KEEPALIVE, (void*)&keepAlive, sizeof(keepAlive));
如果我们不能接受如此之长的等待时间,从TCP-Keepalive-HOWTO上可以知道一共有两种方式可以设置,一种是修改内核关于网络方面的配置参数,另外一种就是SOL_TCP字段的TCP_KEEPIDLE, TCP_KEEPINTVL, TCP_KEEPCNT三个选项。
分享到:
相关推荐
例如,可以使用`setsockopt()`函数,配合`SOL_SOCKET`和`SO_KEEPALIVE`选项,以及`TCP_KEEPCNT`、`TCP_KEEPIDLE`和`TCP_KEEPINTVL`来分别设置上述三个参数。 在实际应用中,理解并正确配置Keepalive参数至关重要。...
setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive, sizeof(keepalive)); setsockopt(rs, SOL_TCP, TCP_KEEPIDLE, (void *)&keepidle, sizeof(keepidle)); setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, ...
- `SO_KEEPALIVE`:启用或禁用TCP保活定时器,仅对TCP套接字有效,同时设置`sock->sk->sk_flag`中的SOCK_KEEPOPEN标志。 - `SO_OOBINLINE`:允许紧急数据与普通数据流合并,通过设置`sock->sk->sk_flag`中的SOCK_...
keepalive是在TCP中一个可以检测死连接的机制,作用是保持socket长连接不被断开,属于tcp层的功能,并不属于应用层。 TCP层怎么做到保持长连接的呢? 先看keepalive的用法:有三个参数,开放给应用层使用 sk->...
- `SO_KEEPALIVE`:保持连接活动。 - `SO_LINGER`:设置连接关闭时的延迟时间。 - `SO_OOBINLINE`:将带外数据合并到正常数据流中。 - `SO_RCVBUF`和`SO_SNDBUF`:分别设置接收和发送缓冲区的大小。 - `SO_RCVLOWAT`...
sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) ``` 在服务器端,Keepalive机制有助于减少由于临时网络问题导致的客户端重新连接,从而提高用户体验。同时,它也能帮助及时发现并关闭无效的连接,...
Socket选项表中包含多种选项,如`SO_DEBUG`、`SO_DONTROUTE`、`SO_KEEPALIVE`、`SO_LINGER`、`SO_OOBINLINE`、`SO_RCVBUF`、`SO_RCVLOWAT`、`SO_SNDBUF`、`SO_SNDLOWAT`、`TCP_MAXSEG`和`TCP_NODELAY`等。...
3. **参数option_name**:表示我们要设置的具体选项,如SO_DEBUG、SO_REUSEADDR等。 4. **参数option_value**:指向包含新选项值的缓冲区,根据option_name的值决定其含义。 5. **参数option_len**:表示option_...
if (setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (void*)&keepAlive, sizeof(keepAlive)) == -1) { ACE_DEBUG((LM_INFO, "setsockopt SO_KEEPALIVE error!\n")); } if (setsockopt(s, SOL_TCP, TCP_KEEPIDLE, (void*...
setsockopt(socket_fd, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval)); ``` 这将启用保活功能,但默认的保活参数可能不符合具体需求。要自定义保活定时器参数,可以使用`TCP_KEEPIDLE`、`TCP_KEEPINTVL`...
int nRet = setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (char*)&bKeepAlive, sizeof(bKeepAlive)); if (nRet == SOCKET_ERROR) { // 错误处理 } ``` 这段代码设置了socket选项,使得TCP连接启用keepalive功能。...
例如,SO_RCVBUF和SO_SNDBUF可以调整接收和发送缓冲区的大小,SO_KEEPALIVE可启用连接保持,而SO_LINGER控制连接关闭时的行为。 6. **选项设置** - 通过setsockopt(),开发者可以自定义socket的行为,例如设置广播...
* SO_KEEPALIVE:保持连接。 * SO_LINGER:延迟关闭连接。 * SO_OOBINLINE:带外数据放入正常数据流。 * SO_RCVBUF:接收缓冲区大小。 * SO_SNDBUF:发送缓冲区大小。 * SO_RCVLOWAT:接收缓冲区下限。 * SO_...
`SO_REUSEADDR`是Socket选项之一,允许一个Socket在地址处于TIME_WAIT状态时被重新绑定到相同的地址和端口。通常,在关闭一个Socket之后,其地址可能仍然处于TIME_WAIT状态,这会导致如果立即尝试重新绑定同一地址和...
- 常用选项:SO_REUSEADDR、SO_KEEPALIVE等。 #### 五、总结 《Linux Socket编程示例》这本书详细介绍了Socket编程的基本概念和技术细节,并通过丰富的实例演示了如何在Linux系统上实现网络通信。无论是初学者...
通过设置TCP窗口大小(例如,使用setsockopt与SO_SNDBUF和SO_RCVBUF选项),可以优化TCP流的吞吐量。 4. **动态优化GNU/Linux TCP/IP栈**: Linux内核提供了多种可调整的TCP/IP栈参数,以适应不同网络条件和应用...
3. **套接字选项**:你可以通过`setoption()`函数调整套接字的各种参数,如设置SO_REUSEADDR或SO_KEEPALIVE等。 4. **发送和接收数据**:`send()`和`receive()`函数用于向网络发送数据和接收来自网络的数据。`...
在socket编程中,`ioctlsock`常用于配置socket参数或者获取网络设备的状态,如查询网络接口的地址、设置或读取socket选项等。它的使用方式是`ioctl(socket_fd, command, argument)`,其中`socket_fd`是socket描述符...
10. **套接字选项与网络参数**:Java的Socket类还可以设置套接字选项,如SO_LINGER(控制linger时间)、TCP_NODELAY(禁用Nagle算法)等,以优化网络通信性能。 以上只是Java TCP/IP Socket编程的一些基本概念和...