检测无连接的 Unix Domain Socket 是不是没有接收器

Posted

技术标签:

【中文标题】检测无连接的 Unix Domain Socket 是不是没有接收器【英文标题】:Detecting whether a connectionless Unix Domain Socket has no receiver检测无连接的 Unix Domain Socket 是否没有接收器 【发布时间】:2015-05-06 17:49:20 【问题描述】:

我正在设计一个多进程服务器,它需要能够将连接的套接字发送到同级进程。我计划使用 unix 域套接字来执行此操作,但我不想保持打开的 O(n^2) 连接以使它们全部相互连接,所以我正在考虑使用无连接(即 SOCK_DGRAM)UDS(以避免每次连接和断开的开销)。

我担心的是如果其中一个进程崩溃并且不再在其 UDS 套接字上接收消息会发生什么?

发送者是否会阻塞,只是在内核中缓冲数据,给出一个关于问题的明确错误(没有人接收),或者别的什么?

基本上,我想问题归结为“我如何判断是否存在绑定给定 UDS 的(正在运行的)进程?”

【问题讨论】:

【参考方案1】:

如果您尝试sendto 一个不存在的 AF_UNIX SOCK_DGRAM 套接字,sendto(2) 调用应该会失败并显示 ENOENT。因此,只要您检查 sendto 调用的错误返回值,并正确处理它们,一切都会好起来的。

如果您在打开套接字的进程崩溃(并关闭它)时发送到套接字,则会出现竞争条件,这将导致消息丢失,因此您也需要注意这一点。

【讨论】:

如果目标进程绑定()UDS然后崩溃,它不会留下'socket文件'在文件系统上吗?这是否会导致内核简单地缓冲消息,并最终在该缓冲区已满时阻塞/EWOULDBLOCK? 用于 AF_UNIX 套接字的路径与文件系统或任何地方的任何文件没有任何关系——它只是一个长度限制为与文件系统路径相同的最大长度的字符串。 你确定吗?我见过的所有示例都使用 unlink()。

以上是关于检测无连接的 Unix Domain Socket 是不是没有接收器的主要内容,如果未能解决你的问题,请参考以下文章

查找已连接的 Unix Domain Socket 的 PID

每天看点源码 peertalk —— 一种基于 Unix Domain Socket 的 RPC 方法

#yyds干货盘点#网络协议之:socket协议详解之Unix domain Socket

nc访问的ZeroMQ IPC Unix Domain Socket

Unix Domain Socket:在一个服务器进程和多个客户端进程之间使用数据报通信

【socket】关于Unix域套接字(Unix Domain Socket)