在不使用轮询的情况下检测AF_UNIX,SOCK_SEQPACKET套接字上的连接关闭

时间:2013-08-13 19:15:20

标签: c linux networking unix-socket

对于使用socket(AF_UNIX, SOCK_SEQPACKET, 0)创建的绑定和连接(到未绑定的对等体)套接字,是否有办法检测远程端是否已挂起,而不使用{{1} }(poll标志将被设置),POLLHUP(由于某种原因,出现在写入fd集中),或类似的东西?

select不同,0长度的有效负载是有效的,并且与流的末尾无法区分(据我所知;当在套接字上调用SOCK_STREAM时,我不断获得0长度的块远程端称为recvmsgshutdown)。此外,close中没有任何已知(对我而言)标志,表示连接结束。我在Linux内核源代码(struct msghdr)中看到的唯一内容是内核返回net/unix/af_unix.c:unix_seqpacket_recvmsg,大概是在套接字没有连接的情况下,然后执行与-ENOTCONN相同的工作。

请注意,使用SOCK_DGRAM而不是recvmsgrecv等非常重要,因为我需要检查recvfrom的标记。

0 个答案:

没有答案