【发布时间】:2012-08-20 05:11:06
【问题描述】:
情况如下:我有两台机器,A 和 B。A 监听一个端口 p。 B 创建一个套接字 s1 并连接到 p。 A 接受套接字 s2 中的连接。目前,A 和 B 可以通过套接字相互通信。
但是,如果我杀死 A 中的程序,然后在一段时间后重新启动该程序,B 不知道,因为在此期间它没有向 A 发送任何数据。现在 B 开始通过 s1 向 A 写入数据。接下来会发生什么?为什么?
其实我发现write调用没有失败但是A还是没有得到数据。而且,如果我把s1放到epoll设备中,我发现epoll_wait在调用write之后返回的事件是EPOLLERR | EPOLLHUP。为什么?
不幸的是,在这种情况下,它似乎丢失了数据,因为 `write' 调用没有失败,但 A 无法获取数据。有什么解决办法吗?
【问题讨论】:
-
B 应该得到
EPIPE失败的write。你怎么知道write没有失败?一些示例代码 + 输出会有所帮助。 -
一般情况下,您不能依赖写入时没有错误来指示数据已传输。您需要在关闭时检查错误。写入磁盘和套接字都是如此。
标签: linux sockets unix network-programming