【问题标题】:Problem with blocking unix domain sockets阻塞 unix 域套接字的问题
【发布时间】:2011-02-10 03:56:53
【问题描述】:

我正在为 Mac OS X 编写一个分为两部分的应用程序 - 一个守护进程和一个代理。我正在使用标准的 unix 套接字在守护进程和代理之间进行通信。也就是说,套接字是用PF_UNIXSOCK_STREAM 创建的。

创建代理时(每当用户登录时),它所做的第一件事就是连接到套接字。这似乎对第一个代理非常有效。但是,当第二个代理连接时,守护程序会遇到以下问题:

我正在使用select() 来检查可以读取的数据。 select()调用成功,表示有数据要读取。但是,当我调用recv() 时,它返回-1,并且errno 设置为35,或"Resource temporarily unavailable".

现在,我希望这是一个非阻塞套接字,但我已经三重检查 - 我从未将套接字设置为非阻塞。

据我所知,这只发生在第二个代理连接到同一个 unix 套接字时。如果我将自己限制为一个守护进程和一个代理,那么一切似乎都运行良好。是什么导致了这种奇怪的行为?

【问题讨论】:

    标签: c++ macos unix sockets ipc


    【解决方案1】:

    这听起来有点像您试图从错误的客户端 fd 中读取。不看你的代码很难说,但从你的描述听起来也有点像。

    所以以防万一,下面是它的工作原理。您的服务器以三个文件描述符结束,它首先开始侦听的套接字,然后是每个连接的客户端的一个文件描述符。当原始套接字上有东西要读取时,这意味着有一个新客户端;听起来你说得对。然后,每个连接的客户端都会为您提供自己独立的 fd 来读取/写入。如果其中的 any 已准备好读取,则调用 select() 将返回;然后,您必须使用 FD_ISSET() 检查 select 中的 readfds 变量中的每个 fd,以查看它是否确实有要读取的数据。

    您可以查看此类代码的基本示例here

    【讨论】:

      猜你喜欢
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 2018-05-18
      • 2010-10-31
      • 2013-10-15
      相关资源
      最近更新 更多