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

时间:2014-06-18 07:23:03

标签: c++ c linux sockets

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

2 个答案:

答案 0 :(得分:4)

始终从最低可用编号分配文件描述符。这是由POSIX保证的。

答案 1 :(得分:1)

即使以这种方式实施,如果您关心可移植性和可靠性,也不能依赖它。

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

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