setsockopt 的目的到底是啥?
Posted
技术标签:
【中文标题】setsockopt 的目的到底是啥?【英文标题】:What exactly is the purpose of setsockopt?setsockopt 的目的到底是什么? 【发布时间】:2021-12-23 15:20:15 【问题描述】:我构建了一个简单的客户端-服务器架构,使用多线程回显服务器处理来自客户端的请求。我已经在 C 中实现了这一点,并且服务器和客户端完全按预期工作。 但是,我最近遇到了 setsockopt 系统调用,我不能很清楚地理解为什么需要它。即使在socket系统调用后将其添加到服务器代码中,我也没有注意到程序有任何区别。
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT,
&opt, sizeof(opt)))
关于为什么真的需要这样做的任何指示?手册页和其他网站似乎没有清楚地回答为什么它是有益的。
【问题讨论】:
我不认为setsockopt
支持像SO_REUSEADDR | SO_REUSEPORT
这样的选项;相反,您需要进行两次单独的调用,每个 SO_* 值调用一次。
那里有很多文档。在您真正遇到问题之前,这样的问题毫无意义。
@JeremyFriesner 确实没有,因为 SO_*
标志不是 2 的幂。
【参考方案1】:
setsockopt
是“设置套接字选项”的缩写,它很好地总结了它的目的——作为一种为套接字设置各种选项的通用方法。它的设计足够灵活,可以支持当前的可选功能以及将来可能添加到网络堆栈的任何其他选项,因此调用的(相当尴尬的)传递指针和大小语义,如有必要,可用于传递任何类型或数量的选项配置数据。
至于在您的代码 sn-p 中指定的特定选项(不正确,顺便说一句):SO_REUSEADDR
参数告诉操作系统调用 bind()
这个套接字被允许重用本地地址;这在停止然后快速重新启动服务器时特别有用,因为否则您要绑定的地址可能仍会分配给以前的服务器实例,因此您的服务器将无法在几分钟内对其进行 bind() .
SO_REUSEPORT
告诉操作系统您希望允许多个套接字同时绑定到同一个套接字地址;它很有用,例如当运行多个客户端都希望同时接收来自给定端口的多播或广播流量时。
有关这些选项的更多信息,请参阅socket (7) man page。
【讨论】:
以上是关于setsockopt 的目的到底是啥?的主要内容,如果未能解决你的问题,请参考以下文章
ELB 和 beanstalk 和其他服务的托管区域 ID 的目的到底是啥?