select()参数无效

select()参数无效,c,sockets,C,Sockets,我有一个由6个插座组成的阵列,每个插座都设计用来监听传入的消息。在每个套接字上,我需要调用select()来侦听传入的消息。这段代码可以编译,但当我运行它时,会收到一条消息 选择失败:参数无效 errno:22 有人能看出我做错了什么吗?谢谢 此代码位于int main()中: int-listenfd[6]; fd_集读取_集; 结构时间值电视; 时间不是开始时间; 建立连接(listenfd、neighbor、servAddr、read\u set); FD_零(读取集和读取集); //将接

我有一个由6个插座组成的阵列,每个插座都设计用来监听传入的消息。在每个套接字上,我需要调用select()来侦听传入的消息。这段代码可以编译,但当我运行它时,会收到一条消息

选择失败:参数无效

errno:22

有人能看出我做错了什么吗?谢谢

此代码位于int main()中:

int-listenfd[6];
fd_集读取_集;
结构时间值电视;
时间不是开始时间;
建立连接(listenfd、neighbor、servAddr、read\u set);
FD_零(读取集和读取集);
//将接受的连接添加到读取集,以便与select()一起使用

对于(i=0;i在调用选择时使用listenfd[]+1中的最大值,而不是硬编码的值6,其他文件描述符(如stdin等)占据前几个插槽。

使用listenfd[]中的最大值+1在调用select时,而不是硬编码的值6,其他文件描述符,如stdin等,占据前几个插槽。

我认为以下几行中有一个错误:

int max = listenfd[0];
for (i=1; i<6; i++) {
    if (listenfd[i] > listenfd[i-1]) {
        max = i;
    }
}
int max=listenfd[0];
for(i=1;我听了nfd[i-1]){
max=i;
}
}
应修改为:

int max = 0;
for (i=1; i<6; i++) {
    if (listenfd[i] > listenfd[max]) {
        max = i;
    }
}
int max=0;
对于(i=1;我列出了nfd[max]){
max=i;
}
}

我认为以下几行中有一个bug:

int max = listenfd[0];
for (i=1; i<6; i++) {
    if (listenfd[i] > listenfd[i-1]) {
        max = i;
    }
}
int max=listenfd[0];
for(i=1;我听了nfd[i-1]){
max=i;
}
}
应修改为:

int max = 0;
for (i=1; i<6; i++) {
    if (listenfd[i] > listenfd[max]) {
        max = i;
    }
}
int max=0;
对于(i=1;我列出了nfd[max]){
max=i;
}
}

问题出在以下几行:

gettimeofday(&tv, NULL);
start_time = tv.tv_sec;

tv变量不能用于捕获当前时间,然后作为参数传递给select()。请使用其他timeval处理时间戳,并将原始tv值保留为select()的参数;

问题在于以下几行:

gettimeofday(&tv, NULL);
start_time = tv.tv_sec;

tv变量不能用于捕获当前时间,然后作为参数传递给select()。请使用不同的timeval来处理时间戳,并将原始tv值作为select()的参数;

也许
struct timeval
不喜欢5000000(5秒)作为tv_usec字段的一部分?您想要什么超时值?目前,我并不真正关心这是什么值。我在这里尝试了一些不同的值,但每次都得到相同的结果。实际上,我刚刚在Linux内核上检查了一个大型tv_usec示例,它似乎按照预期工作。在您的示例中,最大延迟为10秒。我不认为这是你的问题,请看相关人员的回答。也许
struct timeval
不喜欢5000000(5秒)作为tv_usec字段的一部分?您想要什么超时值?目前,我并不真正关心这是什么值。我在这里尝试了一些不同的值,但每次都得到相同的结果。实际上,我刚刚在Linux内核上检查了一个大型tv_usec示例,它似乎按照预期工作。在您的示例中,最大延迟为10秒。我不认为这是你的问题,请参阅Pelaton的答案。我以前尝试过这个,但错误相同。不过,你是对的,我应该这样写这行。我使用硬编码值是因为尝试使用此方法失败。即使尝试此方法,我仍然会收到相同的错误。请确保检查返回代码om套接字()、bind()和listen()。如果fd有效,则不会失败。请参阅[其他答案]()为了可能的解释。我以前尝试过这个,但还是有相同的错误。不过,你是对的,我应该这样写这行。我使用硬编码值是因为尝试使用此方法失败。即使尝试此方法,我仍然会收到相同的错误。请确保您正在检查来自套接字()、绑定()和侦听()的返回代码。如果fd有效,则不会失败。有关可能的解释,请参阅[其他答案]()。