gpt4 book ai didi

c++ - 阻塞 unix 域套接字的问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:00:43 25 4
gpt4 key购买 nike

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

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

我正在使用 select() 检查可以读取的数据。 select() 调用成功,表示有数据需要读取。但是,当我调用 recv() 时,它返回 -1,并且 errno 设置为 35,或者“资源暂时不可用”。

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

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

最佳答案

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

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

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

关于c++ - 阻塞 unix 域套接字的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2675648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com