【问题标题】:how to detect a connected Unix domain datagram socket was closed如何检测连接的 Unix 域数据报套接字已关闭
【发布时间】:2021-10-13 15:57:36
【问题描述】:

app A和app B创建了Unix域数据报套接字,A调用connect连接B,所以A可以使用readwrite 0r sendrecv与B通信。但是如果B崩溃了,A 将在recv.B 重新启动时阻塞,向 A 发送消息会得到错误 1 ​​操作不允许。有什么方法 A 可以检测到 B 崩溃了吗?

操作系统:Ubuntu 18.04 内核 4.18.0

【问题讨论】:

  • 既然你有这个标签的linux,考虑使用SOCK_SEQPACKET套接字而不是数据报。
  • 不,没有办法区分已经崩溃的B和目前无话可说的B。
  • @n.1.8e9-where's-my-sharem。我怀疑有某种 kludge-on-a-kludge 解决方案使用lsof-type 的方法来遍历/proc,看看 B 是否仍然有一个到 Unix 域套接字的开放套接字...

标签: c linux sockets ipc unix-socket


【解决方案1】:

如果您想检测连接错误,面向连接的套接字可能更合适,例如:SOCK_STREAM 或 SOCK_SEQPACKET

来自socket的手册页:

...

如果对等协议有缓冲空间的一段数据在合理的时间内不能成功传输,则认为该连接已死。当在套接字上启用 SO_KEEPALIVE 时,协议会以特定于协议的方式检查另一端是否还活着。

...

SOCK_SEQPACKET 套接字使用与 SOCK_STREAM 套接字相同的系统调用。

可以通过O_NONBLOCK 标志(在描述符上)或recv 标志MSG_DONTWAIT 来实现非阻塞读取。

无连接协议的连接错误检测必须在应用程序中实现。您可以实现一个简单的 ping / heartbeat 机制,其中客户端必须在特定时间间隔内发送(空)数据包,以表明它仍然处于活动状态或仍在参与通信。

编辑:我已将 tcp/udp 用作 SOCK_STREAM/SOCK_DGRAM 的同义词(正如用户 Shawn 在下面的 cmets 中指出的那样)。

【讨论】:

  • OP 正在使用 unix/本地套接字。不涉及 UDP 或 TCP
猜你喜欢
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
相关资源
最近更新 更多