gpt4 book ai didi

c - 索拉里斯 10 : handle gracefully ENOBUFS error when changing socket buffer

转载 作者:行者123 更新时间:2023-12-02 02:31:22 25 4
gpt4 key购买 nike

我无意中发现了 Solaris 10 套接字和其他 Linux/*NIX 套接字之间的特殊区别。示例:

int temp1, rc;
temp1 = 16*1024*1024; /* from config, a value greater than system limit */
rc = setsockopt( sd, SOL_SOCKET, SO_RCVBUF, &temp1, sizeof(temp1);

上述代码在所有系统(Linux、HP-UX 和 AIX)上都将具有 rc == 0,Solaris 10 除外。其他系统会静默地将提供的值截断为允许的最大值。 Solaris 10 理所当然地 失败,errno == ENOBUFS 指示配置错误。

经过深思熟虑,决定由于特定应用程序是关键而不是失败,所以它应该尽可能优雅地继续工作:

  1. 在日志文件中生成有关配置不匹配的警告(很简单,使用 getsockopt() 添加检查)和
  2. 尝试设置最大缓冲区大小(以获得可能的性能)。

#2 是我卡住了。在所有非 Solaris 系统上,我不需要做任何事情:套接字已经为我做了。

但是在 Solaris 上我不知所措。我围绕 (setsockopt(...) == -1 && errno == ENOBUFS) 条件实现了一些简单的二分法来查找最大缓冲区大小,但它看起来很难看。 (我也没有上下文来保存查找结果:必须对具有如此糟糕配置的每个连接重复搜索。全局变量是有问题的,因为代码在共享库中并且从 MT 应用程序中使用。)

在 Solaris 10 上是否有更好的方法来使用套接字 API 检测最大允许缓冲区大小?

有什么方法可以告诉 Solaris 的套接字 API 像其他系统那样截断值吗?

最佳答案

目前我无法访问 Solaris 10 系统,但根据 Oracle documentation ,您可以使用 ndd 实用程序查询(和设置)已配置的 TCP 和 UDP 缓冲区大小最大值:

$ ndd -get /dev/tcp tcp_max_buf
$ ndd -get /dev/udp udp_max_buf

我不知道 C API,但也许 ndd 使用的东西被暴露了?

关于c - 索拉里斯 10 : handle gracefully ENOBUFS error when changing socket buffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3701825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com