当 Fd 大于 1024 时选择和FD_SET的行为
Behavior of Select and FD_SET When Fd is Bigger than 1024
据
我所知,select仅支持不超过1024个套接字。但是一个进程可以拥有 65535 个套接字,这意味着大多数套接字号都大于 1024,所以我有三个问题:
问题 1.如果将大于 1024 的套接字号传递给 FD_SET() 会发生什么情况?
问题 2.如果将套接字编号都大于 1024 的fd_set传递给 select() 会发生什么?
问题 3.在内核为 2.6.8、x86 64 位的 Linux Fedora 上,Q1 和 Q2 会抛出异常吗?
fd_set
是一个位数组,仅使用FD_*
宏进行操作,因为 C 没有"位"类型。(该类型是正式不透明的,可以以不同的方式实现 - 事实上winsock确实以不同的方式实现它 - 但所有类似Unix的操作系统都使用位数组。
所以这段代码:
fd_set my_fds;
....
FD_SET(1024, &my_fds);
具有与此代码相同的问题:
char my_fds[1024];
....
my_fds[1024] = 1;
假设FD_SETSIZE
是 1024。
您将覆盖内存中fd_set
之后的任何内容,如果您幸运的话会导致段错误,如果您不幸运,则会导致更微妙的错误。
相关文章:
- 为什么我无法更改"set<set>"循环中的值<int>
- 对于set上的循环-获取next元素迭代器
- 在声明中合并两个常量"std::set"(不是在运行时)
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将 std::set 与基于键的比较器一起使用
- 如何使用set实现无序数据结构?
- 使用运算符调用 void 函数时出错<set>
- 修改"std::set"中用户定义类型的值
- 生成提升::hana::set 的常量表达式问题
- 如何在构造函数参数中初始化"std::set"?
- 如何使用 lower_bound/upper_bound 从 std::set 获取索引号?
- 如何在 C++ 中转发声明 std::set?
- 重构使用动态强制转换的 std::set 的比较运算符
- set::find 查找不存在的元素
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- 将 std:set<int32_t> 复制到 std::set <uint32_t>的好方法
- 错误 C2676:std::set::const_iterator 没有运算符 + 函数?
- std::set 是否将对象连续存储在内存中?
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- google test PrintTo for std::set<std::string>