- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我们有一个使用 select() 设计的网络服务器,直到上周才真正看到太多负载,并且在我们的 500-1000 conn/s 负载下始终可以正常工作。然而,我们最近开始看到更高的负载(和尖峰)并遇到了 select() 在看到套接字句柄 > FD_SETSIZE 后变得疯狂的问题。如果它的 FD_SET 中有任何 > FD_SETSIZE 的东西,这只会在重复超时后卡住服务器,选择进入一个牢不可破的循环。切换到 poll(或 epoll)的选项现在不存在,我们必须坚持使用 select。我现在修复它的方法是增加监听队列,当我看到一个新连接返回 accept() 时停止接受新连接 >= FD_SETSIZE 并返回到监听套接字上的 select() 。这是可行的,因为操作系统会回收文件句柄并始终尝试提供最小的可用句柄。但不利的是,如果套接字句柄 >= FD_SETSIZE,我最终会在调用 accept() 时向某些连接发送 RST。现在这仍然是可以接受的,因为它使服务器保持运行并且连接丢失率约为 5%。有没有一种方法可以在不断开这些连接的情况下做到这一点。我不想对所有使用过的 handle 和其他东西进行计数,这让它变得太复杂了。创建一个伪造的套接字,检查它的句柄并在调用 accept 之前关闭它,将相当准确地估计操作系统接下来要给我的句柄。
while(max_conn_to_accept--){
SOCKET a_s = accept(..);
if(a_s >= FD_SETSIZE){
close(a_s);
return;
}
最佳答案
只需提高 FD_SETSIZE
。在编译器命令行上指定 -DFD_SETSIZE=16384
。
我认为您的版本足够新,没有其他问题。如果您在头文件中遇到错误,您可能需要调整一两行。
例如,如果您看到这样的内容:
#undef __FD_SETSIZE
#define __FD_SETSIZE 1024
改成这样:
#undef __FD_SETSIZE
#ifndef FD_SETSIZE
#define __FD_SETSIZE 1024
#else
#define __FD_SETSIZE FD_SETSIZE
#endif
或者如果你看到:
#define FD_SETSIZE 1024
将其更改为:
#ifndef FD_SETSIZE
#define FD_SETSIZE 1024
#endif
但是,我再次强调,您不需要进行任何更改。
关于c++ - 在 select 上处理 FD_SETSIZE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12355927/
我需要从 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
这些错误列表的含义是什么,更重要的是如何解决这些错误?如果有人也可以发表评论,那我应该期待什么可能的问题,这可能会促使我采取一些措施,因为我不清楚,因为我的应用程序正在运行并且显示正确 我发现了一个与
我是一名优秀的程序员,十分优秀!