- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我想知道是否有一种简单的方法可以遍历 fd_set?我想这样做的原因是不必遍历所有连接的套接字,因为 select() 将这些 fd_set 更改为仅包含我感兴趣的那些。我也知道,使用不打算直接访问的类型的实现通常是一个坏主意,因为它可能因不同的系统而异。但是,我需要一些方法来做到这一点,而且我的想法已经不多了。所以,我的问题是:
如何遍历 fd_set?如果这是一个非常糟糕的做法,除了遍历所有连接的套接字之外,还有其他方法可以解决我的“问题”吗?
谢谢
最佳答案
你必须在调用 select() 之前填写一个 fd_set 结构,你不能直接传入你原来的 std::set 套接字。 select() 然后相应地修改 fd_set,删除所有未“设置”的套接字,并返回剩余的套接字数。您必须遍历生成的 fd_set,而不是您的 std::set。不需要调用 FD_ISSET() 因为生成的 fd_set 只包含准备好的“set”套接字,例如:
fd_set read_fds;
FD_ZERO(&read_fds);
int max_fd = 0;
read_fds.fd_count = connected_sockets.size();
for( int i = 0; i < read_fds.fd_count; ++i )
{
read_fds.fd_array[i] = connected_sockets[i];
if (read_fds.fd_array[i] > max_fd)
max_fd = read_fds.fd_array[i];
}
if (select(max_fd+1, &read_fds, NULL, NULL, NULL) > 0)
{
for( int i = 0; i < read_fds.fd_count; ++i )
do_socket_operation( read_fds.fd_array[i] );
}
FD_ISSET() 更常发挥作用的地方是使用 select() 进行错误检查时,例如:
fd_set read_fds;
FD_ZERO(&read_fds);
fd_set error_fds;
FD_ZERO(&error_fds);
int max_fd = 0;
read_fds.fd_count = connected_sockets.size();
for( int i = 0; i < read_fds.fd_count; ++i )
{
read_fds.fd_array[i] = connected_sockets[i];
if (read_fds.fd_array[i] > max_fd)
max_fd = read_fds.fd_array[i];
}
error_fds.fd_count = read_fds.fd_count;
for( int i = 0; i < read_fds.fd_count; ++i )
{
error_fds.fd_array[i] = read_fds.fd_array[i];
}
if (select(max_fd+1, &read_fds, NULL, &error_fds, NULL) > 0)
{
for( int i = 0; i < read_fds.fd_count; ++i )
{
if( !FD_ISSET(read_fds.fd_array[i], &error_fds) )
do_socket_operation( read_fds.fd_array[i] );
}
for( int i = 0; i < error_fds.fd_count; ++i )
{
do_socket_error( error_fds.fd_array[i] );
}
}
关于c++ - 如何遍历 fd_set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3661285/
我遇到了 FD_SET 使我的程序崩溃的问题。我正在运行来自 boost Boost ASIO sample HTTP Server 的示例代码.在请求处理程序中,我放置了一个第三方 api,最终会进
**编辑:我找到了解决方案。** 对于那些敢于阅读以下内容的人,我有一个奇怪的问题: 我正在做家庭作业,需要使用 UNIX 管道在进程之间发送消息。 我对这段代码的意图是对提供的文件描述符进行 sel
我想知道是否有一种简单的方法可以遍历 fd_set?我想这样做的原因是不必遍历所有连接的套接字,因为 select() 将这些 fd_set 更改为仅包含我感兴趣的那些。我也知道,使用不打算直接访问的
我有以下 C 代码,用于设置 select() 以监听 TCP 套接字和消息队列上的传入数据: fd_set readSet; u32 maxFD = 0; mqd_t parentQueue; in
嗨,现在我想知道客户端或服务器是否断开连接,然后发送错误,但我似乎无法让它工作,我不知道该怎么做,所以我真的需要帮助 plz 这是我的代码 #ifdef _WIN32 || _WIN64
我的代码有问题,我无法找出问题所在,因为我是 select() 的新手; 谁能告诉我问题出在哪里? run_fct.c: In function ‘run’: run_fct.c:22: error:
我在编写我的第一个带有单选调用的异步服务器时遇到了这个问题: if( (retv = select((hsock 0) { printf("select() ended...\n");
我在 Linux 中有一个工作代码,正在移植到 Windows。它使用套接字库。 当我声明 fd_set xyz 时,它通过一个错误提示 error C2065: 'xyz' : undeclared
我在两个 UDP 套接字上有一个 select。有时 select 返回 2,因此两个套接字都已准备好接收,但我想首先接收可读取的最旧消息。有什么方法可以存档吗? 我需要首先获取最先到达的消息: 消息
如果当我在 select 系统调用中使用的 rdset 中放置一个连接描述符时,客户端关闭了该描述符,因此在调用 select 时它已经关闭,它是否仍会被选中并读取/在上面写上 return 0? 还
我目前正在处理的应用程序是一个服务器,它将使用 select() 管理与客户端的连接,每次服务器收到消息时,它都会打开一个新线程以读取套接字。在此期间,套接字的文件描述符从集合中删除,并将在读取结束时
我知道这不是出现此错误的第一个线程,但我真的无法理解问题所在...我的代码如下: /* File descriptor sets */ struct descs { fd_set read;
最近被FD_SET缓冲区溢出咬了两次。第一次是我们有太多套接字 (1024+) 添加到 FD_SET 中。这是一个测试用例,我们已将其禁用,并添加 assert 来检测此用例。 今天,当我们运行一个测
根据这篇文章poll vs select vs event-based : select() only uses (at maximum) three bits of data per file de
我有一个关于向 FDSET 添加新套接字文件描述符的问题。假设我们已经连接到套接字 s1: fd_set readfds; //s1 = socket(...); //connect(s1, ...)
我正在编写一个使用 select() 的程序,给定一个要读取的 fd_set。 在程序中,我保存了两个 fd_sets: 1. fd_set 名为 DB,包含我可以处理的所有 fd。 2. fd_se
我正在开发一个多客户端 Unix Domain Socket,以通过多个进程传输数据。我找到了一些实现每个客户端和其他东西之间聊天的代码,但我希望一旦客户端向服务器发送某些内容,服务器就会回复并断开客
我不是网络编程专家。我基本上有两种客户,他们有不同的超时时间。我应该使用带有连接套接字的 UDP 来进行客户端-服务器通信。 问题是双重的: a) 无论哪个客户端(或者套接字)在 t1 秒内没有响应,
我正在使用 select() 来衡量服务器没有收到任何新消息的时间。代码非常简单,看起来像这样: int res = -1; do { FD_ZERO(&readfds); FD_SE
我试图了解套接字编程和处理多个连接时的不同做法。特别是当服务器需要为多个客户端提供服务时。 我看过一些代码示例;其中一些使用 fd_set 而另一些使用 fork() 系统调用。 大致: FD_SET
我是一名优秀的程序员,十分优秀!