我可以使用非阻塞套接字使用“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 从一个进程发送到另一个进程吗?