我可以使用非阻塞套接字使用“sendmsg/recvmsg”将 FD 从一个进程发送到另一个进程吗?

Posted

技术标签:

【中文标题】我可以使用非阻塞套接字使用“sendmsg/recvmsg”将 FD 从一个进程发送到另一个进程吗?【英文标题】:Can I use non-blocking sockets to send FDs from one process to another using "sendmsg/recvmsg"? 【发布时间】:2012-06-21 05:04:09 【问题描述】:

我需要创建一个通过 Unix 套接字连接的客户端-服务器模型。我的客户端将请求服务器打开一个只有服务器具有权限的文件。服务器将打开文件并使用“sendmsg”API 发送 FD,客户端将使用“recvmsg”接收 FD。现在我的问题是我可以使用非阻塞套接字来实现这一点吗? 另外,如果可能的话,我怎么知道客户端消息的长度?

请指出一些相同的非阻塞实现。

【问题讨论】:

socket的阻塞状态与它无关。对于实际的描述符传输,我建议谷歌搜索“通过 unix 域套接字发送文件描述符”之类的术语。另外,what have you tried? 复制:***.com/questions/1788095/… 【参考方案1】:

相关:http://lists.canonical.org/pipermail/kragen-hacks/2002-January/000292.html 所以我的回答不完整。

【讨论】:

【参考方案2】:

你应该使用sendfile在FD和socket之间传输文件。

如果套接字是非阻塞的,则 sendfile(或 send 或 sendmsg)调用可能会返回一个值,指示已完成的部分数量。使用 select() 或 poll() 来获得何时可以再次发送的通知(从文件描述符中的上一个点开始,当上一次发送停止时)。

至于文件长度,您必须自己将其添加到您的请求/响应协议中。 (例如,在服务器上调用 stat(),发送文件长度,然后发送文件本身)。

【讨论】:

以上是关于我可以使用非阻塞套接字使用“sendmsg/recvmsg”将 FD 从一个进程发送到另一个进程吗?的主要内容,如果未能解决你的问题,请参考以下文章

非阻塞套接字轮询与阻塞套接字

我可以使用非阻塞套接字使用“sendmsg/recvmsg”将 FD 从一个进程发送到另一个进程吗?

windows下在非阻塞TCP套接字上使用SO_SNDBUF的奇怪行为

没有 while(true) 循环的 C# 非阻塞套接字

在 C 中使用非阻塞套接字连接

有人可以很好地解释非阻塞套接字的“发送”行为吗?