【发布时间】:2015-07-07 02:18:22
【问题描述】:
旧版本
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()时会崩溃,然后我搜索新版本并尝试,它仍然崩溃。我还尝试移出所有我认为可能是堆栈溢出的局部变量,但它仍然崩溃。
有人可以回答这个问题吗? 非常感谢。
【问题讨论】:
-
max_socket设置为什么?为什么不是fdmax + 1? -
这是一个长镜头,但请检查 sockserver 是否小于 FD_SETSIZE。
-
另外,至少在 BSD 上,有
void FD_COPY(fd_set *fdset_orig, fd_set *fdset_copy);— 使用 cack-handed '(src, dst)' 参数而不是像大多数其他复制函数一样的 '(dst, src)' (@987654330 @、memmove()等)。不幸的是,POSIX 没有对其进行标准化(参见FD_CLR());我想知道这是否是因为不同的实现。 Linux(已检查 Ubuntu 14.04 LTS)似乎没有FD_COPY。 -
您可能还注意到 POSIX
<sys/select.h>说:<sys/select.h>标头应将fd_set类型定义为结构。 至少有中等机会可以使用结构副本,除非您正在修改它的大小 - 请参阅 Are there any platforms where using structure copy on anfd_setcauses problems? 和我的 answer 那里。 (也许 5 年后需要更新?) -
关于这一行:'rfds = master;'这两个项目都是包含多个字段的结构。所以一个简单的任务是行不通的。建议使用 memcpy(&rfds, &master, sizeof( rfds ) );
标签: c sockets embedded-linux