- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在服务器/客户端设置中,我有一个服务器通过少数(目前是 4 个)不同套接字与客户端连接。目前我使用带有计算 set_size 的 select,但是在值得使用 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
}
最近我不得不添加两个新 socket ,将来可能需要添加更多。什么时候使用 FD_SETSIZE 而不是计算的 set_size?
最佳答案
我从不担心这一点,因为与最初使用 select()
的性能损失相比,它似乎会产生非常小的差异。
话虽如此,我认为计算正确的值总是值得的,因为它的计算成本不是很高:如果按照您的建议将当前 set_size
保存在局部变量中,它就是 每次添加 fd 时 O(1) 的常数非常低(即比较和可能的更新)。删除一个 fd 也是 O(1) 除了它是列表中的最后一个(在这种情况下它是 O(set_size
) 但通常更好的)。另一方面,不计算 set_size
意味着每次调用 select
时内核都必须遍历所有 FD_SETSIZE
条目。由于 set_size
可能比 FD_SETSIZE
小很多,因此提供较小的值是值得的。即使 set_size
接近 FD_SETSIZE
,计算 set_size
的成本也非常低,可能几乎总是值得的。
当然,如果您担心性能到这种程度,您需要查看 poll()
而不是 select()
。更好的是,您需要查看 epoll
和 kqueue
,但它们不可移植,因为这些功能分别仅在 Linux 和 FreeBSD(包括 MacOS)上可用。
关于c - FD_SETSIZE 与计算值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13271481/
我需要从 1024 增加 FD_SETSIZE 值至 4096 .我知道最好使用 poll()/epoll()但我想了解什么是优点/缺点。主要问题是:我要重新编译glibc吗? ?我读了几个线程,其中
我遇到一个问题,即返回的文件描述符会逐渐增加到大于 FD_SETSIZE 的数字。 我的 tcp 服务器不断关闭,这需要我的客户端关闭套接字并重新连接。然后,客户端将尝试通过调用 socket 重新连
在服务器/客户端设置中,我有一个服务器通过少数(目前是 4 个)不同套接字与客户端连接。目前我使用带有计算 set_size 的 select,但是在值得使用 FD_SETSIZE 之前上限是多少?
我目前是 PHP 和 MySQL 的新手,但是,我正在尝试为 Club Penguin Emulator 运行 PHP 服务器代码,但是,随着越来越多的人加入并使加入变得异常困难,我没有运气由于 PH
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我想为我的系统增加 FD_SETSIZE 宏值。有什么办法可以增加 FD_SETSIZE 这样 select 就不会失败 最佳答案 根据标准,无法增加 FD_SETSIZE。一些程序和库(想到 lib
我们有一个使用 select() 设计的网络服务器,直到上周才真正看到太多负载,并且在我们的 500-1000 conn/s 负载下始终可以正常工作。然而,我们最近开始看到更高的负载(和尖峰)并遇到了
我编辑了 __FD_SETSIZE = 1024 到 4096: /usr/include/linux/posix_types.h /usr/include/x86_64-linux-gnu/bits
实际上,我尝试使用带有 java 的 bash 控制台在 opensuse 11 上启动 SIPP 3.3。当我用 开始 SIPP 时 proc = Runtime.getRuntime().exec
我是一名安卓程序员。 今天我运行一个 Android 应用程序时遇到了此类错误。 FORTIFY_SOURCE: FD_SET: file descriptor >= FD_SETSIZE. Call
我在新安装的 16"Macbook(带有 OSX 10.15.1 Catalina)上运行 MySQL@5.7 时遇到了一个大问题PDO::__construct():MySQL 服务器已经消失。 这
选择高于 255 的 fds 不检查 fd 是否打开。这是我的示例代码: #include #include #include #include int main() { fd_set
这些错误列表的含义是什么,更重要的是如何解决这些错误?如果有人也可以发表评论,那我应该期待什么可能的问题,这可能会促使我采取一些措施,因为我不清楚,因为我的应用程序正在运行并且显示正确 我发现了一个与
我是一名优秀的程序员,十分优秀!