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

标签 c sockets unix solaris portability

我无意中发现了 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/

相关文章:

linux - 如何在 Linux 中从一个文件中搜索字符串并更新到另一个文件

java - 如何知道是否有足够的内存可以在 Linux 机器上部署新应用程序?

c - strncpy() 随机结果

c - 每当在 C 中调用函数 'main' 时,变量都未初始化

python - C++ wxsocket TCP服务器发送无符号字符数组但python客户端在中获得4个字节

linux - epoll - EPOLLET 容易出现竞争条件吗?

将字符串复制到结构体 C 中

c - strcpy 给出段错误

python - 如何强制操作系统使用 python 释放端口

c - 在 Linux 上用 C 语言使用 RAW Socket 发送组播