- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的操作系统是64位的Centos6.4。我有一个关于如何 fd_set 管理 FD_SET 添加 fd 的问题。代码如下:
fd_set my_set;
FD_SET(31, &my_set);
然后,我显示 my_set.fds_bits[...]。my_set.fds_bits[0] 等于 0x0000000080000000,my_set.fds_bits[1~...] 为零。我可以理解结果。但我也写个案例,代码如下:
fd_set my_set;
FD_SET(63, &my_set);
我显示my_set.fds_bits[...]。my_set.fds_bits[0]等于0x0。在我看来,结果应该是my_set.fds_bits[0]等于0x8000000000000000。我真的不理解为什么第二个结果是 0x0。等于 63 的 fd 在 my_set 中没有状态。
完整的测试代码如下:
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <resolv.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/time.h>
#include <pthread.h>
#define BUFSIZE 1024
void printFDSET(fd_set target_sets)
{
int uIndex = 0;
int model_num = __NFDBITS;
for(uIndex = 0; uIndex < 10/*FD_SETSIZE/model_num*/; uIndex++)
{
printf("0x%016x\t", target_sets.fds_bits[uIndex]);
if(uIndex % 4 == 3)
printf("\n");
}
printf("\n");
return;
}
int main(int argc, char* argv[])
{
fd_set my_set;
FD_ZERO(&my_set);
printf("sizeof(long int) = %d\n", sizeof(long int));
printf("FD_SETSIZE = %d\n", FD_SETSIZE);
printf("size = %zu\n", sizeof __FDS_BITS(&my_set)[0]);
printf("\n\n");
int unfd = 31;
FD_SET(unfd, &my_set);
printf("%d is added to my_set:\n", unfd);
printFDSET(my_set);
printf("\n\n");
FD_CLR(unfd, &my_set);
unfd = 63;
printf("%d is added to my_set:\n", unfd);
FD_SET(unfd, &my_set);
printFDSET(my_set);
return 0;
}
最佳答案
Doesn't fd that is equal to 63 have a state in my_set.
它有。您只是没有正确打印值,因为您忘记了 printf
格式字符串中的长度修饰符 l
。
printf("0x%016lx\t", __FDS_BITS(&target_sets)[uIndex]);
关于c - 关于linux中的FD_SET和fd_set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39124814/
我遇到了 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
我是一名优秀的程序员,十分优秀!