问题标签 [select-function]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1553 浏览

c - select() 未检测到传入数据

Objective: N 个节点(运行在不同的机器上)应该通过相互建立 TCP 连接来相互通信。发送和接收消息由进程创建的 2 个线程完成。最初,主进程将所有节点相互连接,创建 2 个线程并为其提供文件描述符列表,线程可以使用这些文件描述符发送和接收数据。下面的结构由主进程填充并传递给线程。

PS:socketFd 是由 accept() 或 socket() 接收的套接字描述符,具体取决于连接的建立方式(侦听来自节点的连接或连接到节点)。

使用大小为 MAX_NUM_OF_NODES 的 SNodeInformation 数组。

发送线程通过 nodeInformation 并向所有节点发送消息“Hello”,如下所示。

接收线程通过 nodeInformation,设置文件描述符集并使用 select 等待传入数据,如下所示。

预期输出:我只尝试了 2 个进程,P1(首先启动)和 P2 在 machine1 上运行,另一个在 machine2 上运行。机器中的两个进程都应该首先连接,然后线程应该发送和接收消息“Hello”并退出。

观察到的输出:P1 能够发送消息,P2(接收线程)能够接收消息“Hello”。但是 P1(接收线程)无法从 P2(发送线程)获取消息。两台机器上的应用程序代码是相同的,但每次,首先启动的进程都不会从另一个进程中获取消息。我添加了一个打印来检查是否设置了某些文件描述符,但我没有看到它用于 P1,而仅用于 P2。接收过程中的发送没有失败,它返回6。我检查了文件描述符的最大值,它是正确的。

如果我先启动 P2 然后启动 P1,那么我可以看到 P1 接收到来自 P2 的消息并且存在,而 P2 无限等待来自 P1 的消息。

我不确定问题是因为套接字描述符的使用不正确还是因为线程?

0 投票
2 回答
1086 浏览

c - 通过 SIGCHLD 休眠

我有一个 C 程序,它每分钟轮询一次硬件传感器,并将读数添加到数据库中。为了确保读数接近于每分钟(而不是每分钟 + 开销时间),程序会创建一个孩子来完成实际工作,然后在创建另一个孩子之前休眠 60 秒。

我遇到的麻烦是孩子们的 SIGCHLD 正在中断睡眠(60),导致创建无限的孩子​​,而不是每分钟一个。

这就是我一直在尝试的方式:

我还听说 select() 可用于通过执行以下操作来实现我所追求的目标:

但由于某种原因,这只适用于 while 循环中的 1 次迭代。之后,该程序根本不等待,并不断创建孩子。

那么我怎样才能最好地让我的程序做到这一点而不会被 sigchld 打断呢?

0 投票
2 回答
1653 浏览

c - 代理服务器中的 select()

我正在用 c 构建一个代理服务器,我正在尝试理解该select()功能。我已经完成了代码,以便从客户端建立连接,然后提取网址,以便可以建立另一个连接以连接到实际的 Web 服务器。然后该页面被代理接收并传回给客户端。

我知道这select()将允许它处理多个客户端请求,但我不明白它如何帮助(或者更确切地说如何实现)与 Web 服务器的第二个连接。据我了解,我将不再需要一个 while 循环来继续从 Web 服务器接收数据并将其传递回客户端。

我是否需要为 Web 服务器连接设置第二个文件描述符?如果我正在处理两个或多个客户端请求,我如何确保它们与 Web 服务器的正确连接链接在一起?无论如何,我会很感激任何帮助。我已经完成了网络教程和其他一些在线教程,但几天后我仍然没有完全理解这一点。

0 投票
1 回答
1314 浏览

c - FD_SETSIZE 与计算值

在服务器/客户端设置中,我有一个服务器与少数(目前为 4 个)不同套接字上的客户端连接。目前我使用带有计算 set_size 的 select,但是在值得使用 FD_SETSIZE 之前,上限是多少?

下面是一些代码示例来说明这一点。首先构建集合:

以下是 set_size 的计算方式:

以及用法:

最近我不得不添加两个新的套接字,将来我可能需要添加更多。什么时候使用 FD_SETSIZE 而不是计算的 set_size?

0 投票
3 回答
2495 浏览

c++ - 为什么 select() 总是超时?(视窗)

我正在使用 select 尝试等待来自网络上另一台主机的确认,但它总是返回 0。我见过其他有类似问题的线程,他们的问题总是要么他们没有重置 fd_set,要么他们没有为 select() 的第一个参数传递正确的值。这不可能是导致我的问题的原因,因为我正在重置 fd_set,并且显然,根据 msdn 的说法,第一个参数在 windows 中被忽略了。

//下面还有更多 else if 语句,但它永远不会出现在那里

无论如何,此时它返回0。我已经看到客户端和服务器通过套接字相互发送信息,所以我认为我没有发送到客户端的错误地址。这是发送 select() 正在等待的数据包的客户端代码:

我不可能是唯一一个遇到过这个问题的人,有人知道如何解决这个问题吗?

编辑:有人问 _sockAddr 是在哪里填写的,所以我将在此处包括:在某处实例化了一个 ClienThread 类,您可以看到传入的 sockaddr_in。

Edit2:经过进一步调试,我发现对 sendto 的调用达到了预期的目标,因为消息是通过调用 recvfrom 接收的,而不是通过 select。但是,我需要能够使用非阻塞调用。

0 投票
2 回答
2150 浏览

c - 如何在C中为多个UDP数据包设置超时?

我正在编写一个 UDP 服务器/客户端程序,其中服务器通过具有固定窗口大小的单个端口向客户端发送数据包,客户端将为收到的每个数据包发送回 ack 数据包。现在我希望服务器处理丢失数据包的情况。通过一些谷歌搜索,似乎我应该使用ALARMor SELECT。我当然不想发送一个数据包,等待ack或超时,然后再发送另一个,但是SELECT会在超时期间阻塞调用函数,所以我认为它不好。ALARM也不好,因为一个程序只能有一个ALARM. 那么有什么方法可以让我继续跟踪服务器发送的多个数据包的超时时间吗?

0 投票
2 回答
2654 浏览

c - eventfd 是否有 Windows 等效项?

我正在编写一个模拟套接字行为的跨平台库,在两者之间(App->mylib->sockets)具有附加功能。

我希望它对程序员来说是最透明的,所以像 select 和 poll 这样的原语必须与这个 lib 相应地工作

问题是当数据在真实套接字中变得可用时(例如),它必须经过大量处理,所以如果 select 指向真实套接字 fd,应用程序将被阻塞很多时间。我希望仅在准备好使用数据时(在我的库完成所有处理之后)解除阻塞选择/轮询。

所以我遇到了这个eventfd,它允许我做我想做的事,即操纵给定 fd 上的选择/轮询行为

由于我更熟悉 Linux 环境,我不知道windows 相当于 eventfd 是什么。试图搜索但没有运气。

注意: 其他方法是使用与接口连接的另一个套接字,但这似乎开销很大。仅仅因为windows没有(看起来如此)这个功能而对所有数据进行系统调用。

或者我可以实现我自己的选择,重新发明轮子。=/

0 投票
1 回答
147 浏览

c - 即使缓冲区中有数据,select() 也会超时

这个程序(我相信)是 select() 的直接应用程序(在 Debian for ARM 上)。XBEEDEVICE 指向一个串行端口。串行端口存在并且 ic 连接到设备。

问题是,即使接收到数据,select() 也会返回 0。我暂时注释掉了最后一个“else”,程序打印 TIMEOUT,然后是远程设备返回的字符串。

0 投票
1 回答
1876 浏览

c - 非阻塞 connect() 和 EINTR

我正在使用来自 Stevens 的 connect_nonb(),UNIX 网络编程:

此函数允许 connect() 的自定义超时。如果在 select() 中阻塞等待连接成功时,接收到信号,则 select() 以 -1 (EINTR) 退出。此时 select() 超时尚未到期,连接未成功(即目标主机可能断开连接)但随后的 getsockopt() 没有返回错误。

getsockopt() 应该返回错误还是应该由 Stevens 代码检查 select() 的返回码(和 errno)?

当前,当连接到不存在的主机并且信号中断 select() 时,此函数会错误地返回成功。

0 投票
2 回答
7234 浏览

c - 将 select 与阻塞和非阻塞套接字一起使用的影响

如果我使用带有 select() 调用的非阻塞套接字而不是使用带有 select() 调用的阻塞套接字,我的程序的行为会有什么不同?