gpt4 book ai didi

c - 关于套接字 select() 崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 02:41:40 37 4
gpt4 key购买 nike

旧版本

FD_ZERO(&rfds);
FD_ZERO(&master);
FD_SET(sockserver, &master);
fdmax = sockserver;

for(;;) {
rfds = master;
if( select(fdmax+1, &rfds, NULL, NULL, NULL) == -1) {
perror("select");
exit(1);
}

新版本

FD_ZERO(&rfds);
FD_ZERO(&master);
FD_SET(sockserver, &master);
fdmax = sockserver;

for(;;) {
FD_ZERO(&rfds);
for(j=0;j<max_socket;j++){
if(FD_ISSET(j,&master))
FD_SET(j,&rfds);
}
/* Not copying directly, because you can't assume that the set is integer type.
It may be anything. */
if( select(fdmax+1, &rfds, NULL, NULL, NULL) == -1) {
perror("select");
exit(1);
}

我试过旧版本,当运行到 select() 时会崩溃,然后我搜索新版本并尝试,它仍然会崩溃。我也尝试把我认为可能是栈溢出的所有局部变量都搬出去了,但还是崩溃了。

有人能回答这个问题吗?多谢。

最佳答案

在这两个版本中,您都没有正确设置 fdmax。如果 master 中的任何套接字大于 sockserver 的值,select() 将忽略它们。 select() 的第一个参数必须比rfds 中最大的套接字高+1。

此外,在 版本中,无法保证rfds = master 是有效操作。在可能出错的平台上,请改用 FD_COPY():

FD_COPY(&master, &rfds); 

但在这种情况下,通过使用 版本,您不需要使用FD_COPY()(如果它可用)。

正如 Craig 在评论中所说,确保 max_socket 确实有效,不超过 FD_SETSIZE 等。

试试这个:

FD_ZERO(&master);
FD_SET(sockserver, &master);
...

FD_ZERO(&rfds);
fdmax = -1;
for(j = 0; (j < max_socket) && (j < FD_SETSIZE); ++j){
if (FD_ISSET(j, &master)) {
FD_SET(j, &rfds);
fdmax = j;
}
}
if (select(fdmax+1, &rfds, NULL, NULL, NULL) == -1) {
perror("select");
exit(1);
}
...

如果您仍然遇到问题,那么您需要提供一个更现实的 MCVE演示实际问题。

关于c - 关于套接字 select() 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31258691/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com