我无意中发现了 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
指示配置错误。
经过深思熟虑,决定由于特定应用程序是关键而不是失败,所以它应该尽可能优雅地继续工作:
- 在日志文件中生成有关配置不匹配的警告(很简单,使用
getsockopt()
添加检查)和 - 尝试设置最大缓冲区大小(以获得可能的性能)。
#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/