linux/freebsd中的套接字描述符是否保证具有几乎连续的或可比较的数字?

Is it guaranteed that socket descriptors in linux/freebsd will have almost sequential or comparable numbers?

本文关键字:连续 数字 可比较 freebsd 套接字 描述 linux 是否      更新时间:2023-10-16

我明白没有什么可以阻止linux分配描述符在0范围内的任何随机数…2^32当我创建新的套接字。但现实是什么?在我的应用程序(web服务器)中,我需要一个映射结构,将描述符映射到"连接结构"。我知道某种RB-Tree (int -> connection_ptr*)将工作,但connection_ptr指针的线性数组(其中每个指针放置在偏移(索引)=描述符值)会快一点。

文件描述符总是从最低可用数分配。这是POSIX保证的。

即使它是这样实现的,如果你关心可移植性和可靠性,你也不能依赖它。

要获得几乎恒定的访问复杂度,您可以使用散列容器,如std:unordered_map。您甚至可以编写自定义散列器,这样存储将针对文件描述符编号分布进行优化。

struct SocketHasher {
    size_t operator()(uint32_t key) {
        return key & 0xFFFF;
    }
}
std::unordered_map<uint32_t, connection_ptr, SocketHasher> connectionPool;