问题标签 [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 投票
2 回答
402 浏览

c - 当它出现时打开 /dev/ttyUSB*

我有一个程序在计算机运行时始终运行。它通过 USB 设备与串行接口连接。有时,当计算机打开时,设备可能不存在。

我的问题是确认设备文件何时出现的好方法。我可以创建一个无限循环来持续检查文件,假设我知道它的名称将是什么,然后在它获得 fd 时中断。但是还有比这更好的方法吗?

此外,假设在程序运行时设备被拔掉,我的 fd 现在变得无效。发生这种情况时是否会引发一些事件或错误,以便我可以再次开始检查,直到设备文件再次出现?

我使用选择循环从 fd 读取。

0 投票
1 回答
369 浏览

c - linux:当我不希望它返回时,stdin 会导致选择返回

当标准输入上有某些内容时,我在选择返回时遇到问题,即使我不希望它这样做。例如,这里的代码旨在等待套接字上的数据一段时间,但是如果标准输入上有数据,则选择返回:

0 投票
2 回答
3526 浏览

c - c socket prog - select() 问题

我是网络编程的新手。我必须用 C 编写一个简单的客户端/服务器程序。服务器将侦听连接,客户端将连接到服务器,发送消息,并接收来自客户端的回显。我们必须使用 select() 更新它以同时处理从服务器进程到多个客户端的连接。我尝试按照指示在客户端实现 select(),但我认为我在客户端有一个无限循环if(FD_ISSET(clientSockfd, &readfds))

这是服务器..

0 投票
3 回答
1554 浏览

c - C 套接字 - 选择时被阻止

我正在开发一个客户端服务器程序,它使用 select() 调用来监听多个套接字。但是我的 select 调用被阻塞了,尽管我在其中一个套接字中有一条消息,但 select() 调用无法识别它,它仍然在那里无限期地等待。

程序中有 2 个实体,一个主节点和一个客户端。master 知道它将处理的客户端数量并等待客户端连接到它。一旦它收到一个客户端确认,它就会存储它的信息。一旦所有客户端都连接起来,它就会将其相邻客户端的信息发送给每个客户端,这样它就可以形成一个网络。在这里,我使用 select() 来监视许多套接字,master 有一个连接到它的每个子节点的套接字 client 有 3 个主套接字 s1-与 master s2-child 监听此套接字邻居上的连接-the其邻居等待连接的套接字。(即邻居中的 S2) p- 来自其邻居的连接结果的套接字(接受 s2 - 返回 ths) 我使用 select 来监听服务器,它自己的套接字用于传入连接和一次。

最初,我的服务器向其中一个客户端发送一个字符串“hello”,该客户端接收此消息并将其传递给邻居,这样当字符串返回到从服务器接收到此消息的第一个孩子时,它就会传递它到它的邻居。但是尽管所有孩子都在 select() 中等待输入。这可能是什么原因??

提前致谢。

0 投票
1 回答
636 浏览

c++ - 使用 Telnet 测试 select()

我对 Linux/socket 编程相当陌生。我select用来检查我的服务器程序中的连接(它最终将是一个聊天室服务器)。我正在使用 telnet 对其进行测试,但发生了一些奇怪的事情。当我第一次运行 telnet (telnet localhost 5794) 时,select返回 1 并将新连接添加到我的主文件描述符列表中。一切看起来都很好。

但后来我尝试在 telnet 中输入内容,但没有任何反应。除非我打开一个新的 telnet 会话,否则选择返回 0。

只是select为了寻找新的联系?我想我也可以用它来检查输入。下面是我的代码的副本(目前有点乱,因为过去几个小时我一直在疯狂地弄乱它。对不起)

编辑:这是 newConnection 的代码:

checkConnections 函数在它的开头有一个 printf ,所以我可以在它进入函数时看到它。它从不打印。

0 投票
2 回答
1927 浏览

c - FD_SET 的 C 编程错误

我的代码有问题,我不知道问题出在哪里,因为我是 select() 的新手;
谁能告诉我问题出在哪里?




0 投票
2 回答
6140 浏览

c - 由 select() 发出读取信号,但 recv() 在非阻塞套接字上不返回数据和信号 EAGAIN

我已经从 select() 中获得了用于读取的信号套接字,但是 recv call() 没有到达任何数据,而是返回 -1 并带有 errno==EAGAIN。

我可以允许没有其他线程接触套接字。

我认为这种行为是不正确的。如果发生来自另一方的后续关闭,我可以期望来自 recv 的返回值 0(优雅关闭)或其他错误代码,但不是 EAGAIN,因为我认为这意味着数据将在未来到达。

我在这里找到了一些关于该问题的先前线程,但没有解决方案。

这种行为在 Ubuntu Linux Oneric 或其他最后的 Linux 发行版上发生在我身上,然后来自此处发布的链接的信息

对于 3.0.0 内核或最新的 2.6.x,它将在内核中修复是不正确的

有谁知道它为什么会发生以及如何避免这种不需​​要的行为?

0 投票
2 回答
2991 浏览

c - 非阻塞套接字选择在连接后返回 1

首先我想说这是另一个问题:相似但不一样

我的代码如下所示:

我正在连接到存在的机器(IP 地址存在,但没有服务器在我尝试连接的端口上侦听)。

选择总是返回 1。为什么?根据 man 它应该超时并返回 0。在此之后,当我尝试向套接字写入内容时,它返回 -1/ECONNREFUSED。

这是预期的行为吗?如果是,如何在 select() 之后检查我们是否已连接?

0 投票
1 回答
486 浏览

c - C exec/pipe/select 程序 - 缺少子项的输入

我有一个产生子脚本的程序。子脚本只是将任何输入的 1/2 时间重新发送回 STDOUT 和 STDERR。另一半时间,它悄悄地消耗它。我得到的是写给孩子的结果的时间错误:

第 1 行应该是通过相同的 Line1 读取的。同样,第 3 行也应该被相同的 Line3 尝试拾取。

我要解决的问题是我希望能够向孩子写入一行数据,检查任何响应并重复。以下是测试程序:

子脚本:

父 C 程序:

0 投票
0 回答
225 浏览

c - 不寻常的选择/袜子流行为行为

我正在编写一个小程序来请求文件的一块,然后让另一个程序返回该文件的特定块。我可以使用最多约 555000 字节的文件来使其工作,但在任何大于此的情况下,我都会出现异常行为。

在我的循环中,我检查了一个进度缓冲区,它是一个整数数组,以查看我是否有一个特定的文件块。如果我这样做了,那么我就不会发送对该块的请求,但如果我不发送,那么我会向对等方请求该块。我有一个要移动的链接列表,列表中的每个对等点都有一个与之关联的 sockfd。所以,从某种意义上说,我“循环”了请求。一旦我将它们发送出去,我就会等待消息进来。我不知道这是否是最好的方法,但它似乎是最自然的。

但是,对于较大的文件,它会在选择调用时挂起。我不完全确定为什么。如果有人可以对此有所了解,或者提出更好的方法,我很想听听。

这是我的代码。我没有包含我调用的函数的代码,但我认为在这种情况下没有必要(它们是 Beej 的 sendall 和 recvall 函数的修改版本)。还值得一提的是,这是在多线程应用程序中(使用 pthreads),但我没有使用任何共享变量。感谢您抽时间阅读!