【发布时间】:2012-10-10 03:46:34
【问题描述】:
假设一个简单的网络模型:A 已经成功地创建了一个到 B 的 TCP 连接,并且他们正在像这样相互通信
A <----------> B
我知道如果 A 上的程序死掉(例如核心转储),这将导致一个 RST 数据包到 B。所以 B 的任何读取尝试都会导致 EOF,而 B 的任何写入尝试都会导致 SIGPIPE .我说的对吗?
但是,如果假设 A 上的网络出现故障(例如电缆/路由器故障),那么 B 的读/写尝试会发生什么情况?在我的情况下,所有套接字都设置为非阻塞。这样一来,我是不是无法检测到网络错误?
顺便说一句,我注意到套接字中有一个选项SO_KEEPALIVE,它可能对我有用http://tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/。但我想知道如果我将探测间隔设置为 2~3 秒(默认为 75 秒),成本会是多少?而且似乎间隔配置是全局配置,那么这会影响机器上的所有套接字吗?
最后一个问题... 假设网络出现故障,任何写入尝试都会在一段时间后导致 EPIPE。但是,如果我不尝试写入,而是将此套接字放入 epoll 设备中,那么会发生什么? epoll_wait 会返回 EPOLLHUP 或 EPOLLERR 事件吗?
【问题讨论】:
-
最后更新这个问题。添加 epoll 设备的新问题
-
编辑 epoll() 操作的答案 : reff: Edited answer
标签: linux sockets network-programming keep-alive