阻塞Unix域套接字的问题

3
我正在编写一个Mac OS X应用程序,分为两个部分:守护进程和代理。我使用标准的Unix套接字在守护进程和代理之间进行通信。也就是说,套接字是使用PF_UNIXSOCK_STREAM创建的。
当代理被创建时(每当用户登录时),它首先要做的事情之一就是连接到套接字。对于第一个代理,这似乎完美地运行。然而,当第二个代理连接时,守护进程会遇到以下问题:
我使用select()检查可以读取的数据。 select()调用成功,并指示有数据可供读取。但是,当我调用recv()时,它返回-1,并且errno设置为35"Resource temporarily unavailable"
现在,如果是非阻塞套接字,我会预计这种情况,但是我已经三次检查过了 - 我从未将套接字设置为非阻塞。
据我所知,只有当第二个代理连接到同一个Unix套接字时才会发生这种奇怪的行为。如果我限制自己只使用一个守护进程和一个代理,那么一切似乎都完美无缺。是什么导致了这种奇怪的行为呢?
1个回答

2
听起来有点像你试图从错误的客户端文件描述符中读取。没有看到你的代码很难确定,但从你的描述中也可以听出这一点。因此,为了确保万无一失,这里是它的工作原理。你的服务器最终会得到三个文件描述符:首先开始监听的套接字,然后是每个连接的客户端的一个文件描述符。当原始套接字上有可读数据时,这意味着有一个新的客户端;听起来你已经做对了这一部分。每个连接的客户端都会给你一个独立的文件描述符来读/写。调用select()将返回如果任何一个准备好读取;然后你必须使用FD_ISSET()检查select中readfds变量中的每个文件描述符,以查看它是否实际上有数据可读。你可以在这里看到这种类型代码的基本示例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接