c - setsockopt 的目的到底是什么?

标签 c sockets linux-kernel client-server

我构建了一个简单的客户端-服务器架构,其中有一个多线程回显服务器处理来自客户端的请求。我已经用 C 语言实现了这一点,服务器和客户端完全按预期工作。 然而,我最近遇到了setsockopt系统调用,我无法清楚地理解为什么需要它。即使在套接字系统调用之后将其添加到服务器代码中,我也没有注意到程序有任何差异。

if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT,
                                              &opt, sizeof(opt)))

有什么关于为什么确实需要这样做的指示吗?手册页和其他网站似乎没有清楚地回答为什么它是有益的。

最佳答案

setsockopt 是“set socket option”的缩写,它很好地概括了它的用途——作为为套接字设置各种选项的通用方法。它的设计足够灵活,可以支持当前的可选功能以及将来可能添加到网络堆栈中的任何其他选项,因此调用的(相当尴尬的)传递指针和大小语义,如有必要,可用于传递任何类型或数量的选项配置数据。

至于代码片段中指定的特定选项(顺便说一句,这是错误的):SO_REUSEADDR arg 告诉操作系统允许调用此套接字的 bind()重用本地地址;这在停止然后快速重新启动服务器时特别有用,因为否则您想要绑定(bind)的地址可能仍然分配给以前的服务器实例,因此您的服务器将无法在几分钟内对其进行bind() .

SO_REUSEPORT 告诉操作系统您希望允许多个套接字同时绑定(bind)到同一个套接字地址;它很有用,例如当运行多个客户端时,所有客户端都希望同时接收来自给定端口的多播或广播流量。

有关这些选项的详细信息,请参阅 socket (7) man page .

关于c - setsockopt 的目的到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69923217/

相关文章:

c++ - 在 C/C++ 中的无符号左移之前屏蔽是否过于偏执?

c - 循环内段错误

基于 Java 的支持流水线的 HTTP 客户端

c - 文本和数据段使用大页

linux-kernel - Linux : boot arguments with U-Boot and Flat Image Tree (FIT)

c - C 中的 libuv 库 :Change thread pool size

javascript - JS、Socket.io、Phaser3、未创建对象

c# - 通过 TCP 套接字发送命令的最佳方式是什么?

memory-management - Linux 中 APIC 函数的帮助

c++ - 将命令行字符串解析为 argv 格式