C -fd_setsize与计算值



在服务器/客户端设置中,我有一台服务器与少数插座(目前4)上的客户端连接。目前,我使用计算的set_size选择选择,但是在值得使用fd_setsize之前,上限是什么?

下面是一些代码示例来说明这一点。首先建造集合:

FD_ZERO(&set);
FD_SET(socket1, &set);
FD_SET(socket2, &set);
FD_SET(socket3, &set);
FD_SET(socket4, &set);

这是计算set_size的方式:

set_size = MAX(socket1, socket2);
set_size = MAX(set_size, socket 3);
set_size = MAX(set_size, socket4);
set_size += 1;

和用法:

while ((cnt = select(set_size, &set, NULL, NULL, &t)) != -1 || errno == EINTR) {
    if (cnt > 0)
        // Do different stuff depending what socket is active
    else
        // Keep everything alive and add the sockets to the set again
}

最近,我不得不添加两个新的插座,将来可能需要添加更多。您什么时候使用fd_setsize,而不是计算出的set_size?

我从不担心这一点,因为与首先使用select()的性能罚款相比,它似乎会产生很小的差异。

话虽如此,我认为它总是值得计算正确的值,因为计算并不是很昂贵:如果您将当前的set_size保存在本地变量中,则是 o(1)次添加FD时,都会有一个非常低的常数(即,比较并可能进行更新)。删除fd也是 o(1),除了它是列表中的最后一个(在这种情况下是 o( set_size>,但通常更好)。另一方面,不计算set_size表示内核必须每次调用select时都必须遍历所有FD_SETSIZE条目。由于set_size可能比FD_SETSIZE小得多,因此提供较小的值是必要的。即使set_size接近FD_SETSIZE,计算set_size的便宜很便宜,以至于几乎总是值得。

当然,如果您担心在这种程度上的性能,则需要查看poll()而不是select()。更好的是,您需要查看epollkqueue,除非该功能分别仅在Linux和FreeBSD(包括MacOS)上可用。

最新更新