我正在为Mac OS X编写一个分为两部分的应用程序 - 一个守护进程和一个代理程序。我正在使用标准的unix套接字在守护进程和代理之间进行通信。也就是说,套接字是使用PF_UNIX
和SOCK_STREAM
创建的。
创建代理时(无论何时用户登录),其首要任务之一是连接到套接字。这似乎对第一个代理完美有效。但是,当第二个代理程序连接时,守护程序会遇到以下问题:
我正在使用select()
来检查可以读取的数据。 select()
调用成功,表示有要读取的数据。但是,当我致电recv()
时,它会返回-1
,errno
设置为35
或"Resource temporarily unavailable".
现在,我希望这是一个非阻塞套接字,但我已经进行了三重检查 - 我从未将套接字设置为非阻塞。
据我所知,这只发生在第二个代理连接到同一个unix套接字时。如果我将自己限制在一个守护进程和一个代理,那么一切似乎都完美无缺。什么可能导致这种奇怪的行为?
答案 0 :(得分:2)
这听起来有点像你试图从错误的客户端读取fd。没有看到你的代码就很难分辨,但是从你的描述中听起来也有点像。
所以以防万一,这是它的工作原理。您的服务器最终会有三个文件描述符,它首先开始监听的套接字,然后是每个连接的客户端的一个文件描述符。当原始套接字上有东西要读时,这意味着有一个新的客户端;听起来你有这个部分是正确的。然后,每个连接的客户端都会为您提供自己独立的读/写fd。如果任何准备好读取,则调用select()将返回;然后你必须检查readfds变量中的每个fd,用select选择FD_ISSET()来查看它是否确实有要读取的数据。
您可以看到此类代码here的基本示例。