linux - 一个打开的套接字可以长时间不读取吗?

标签 linux sockets networking linux-kernel

我正在打开一个到服务器的套接字,然后休眠,可能会持续很长时间(几天)。该进程是单线程的,所以我没有专用于管理套接字的线程。套接字应该保持事件状态。我假设服务器不发送任何需要客户端响应的消息。

问题是,假设套接字将保持事件状态是否安全? Linux 内核是否处理所需的 TCP 通信(例如保持事件数据包?)或从应用程序不时调用所需的套接字中读取数据?

如果服务器向客户端发送一些消息怎么办?我假设这些数据有一些缓冲区。有多大,怎么改,满了怎么办?

最佳答案

除了这里已经说过的,防火墙和 NAT 可能会在一段时间不活动后丢弃 TCP 连接。 TCP 保持事件消息可能不够频繁以保持 TCP 连接事件。这就是为什么许多应用程序级协议(protocol)具有应用程序级保活消息的原因(例如,我通常将我的 ssh 客户端配置为每 30 分钟发送一次保活消息,因为我的办公室 NAT 在 1 小时后断开 TCP 连接)。

换句话说,您的应用程序可能希望在可配置的时间内与其远程对等方交换一些消息。

或者,使用特定于平台的套接字选项启用 TCP 保持事件消息(SO_KEEPALIVE)并配置超时(TCP_KEEPIDLE 在 Linux 上)。

关于linux - 一个打开的套接字可以长时间不读取吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25370935/

相关文章:

linux - 使用 wget 下载页面提供的文件

php - apache/linux 版本之间 PHP GLOBALS 的差异

regex - 使用 sed,识别文本文件中的正确行并将三个不同部分写入单独的变量

c++ - 用于 UDP 数据包接收的 Qt GUI

c - TCP 网络吞吐量测量

Python3套接字模块: decoding str

python TCP客户端无法连接到我的TCP服务器

linux - 堆栈溢出 - 奇怪的返回地址

Python socket 强调并发

node.js - 如何从连接到同一网络的另一台计算机打开 create-react-app?