对于使用socket(AF_UNIX, SOCK_SEQPACKET, 0)
创建的绑定和连接(到未绑定的对等体)套接字,是否有办法检测远程端是否已挂起,而不使用{{1} }(poll
标志将被设置),POLLHUP
(由于某种原因,出现在写入fd集中),或类似的东西?
与select
不同,0长度的有效负载是有效的,并且与流的末尾无法区分(据我所知;当在套接字上调用SOCK_STREAM
时,我不断获得0长度的块远程端称为recvmsg
或shutdown
)。此外,close
中没有任何已知(对我而言)标志,表示连接结束。我在Linux内核源代码(struct msghdr
)中看到的唯一内容是内核返回net/unix/af_unix.c:unix_seqpacket_recvmsg
,大概是在套接字没有连接的情况下,然后执行与-ENOTCONN
相同的工作。
请注意,使用SOCK_DGRAM
而不是recvmsg
,recv
等非常重要,因为我需要检查recvfrom
的标记。