c - 为什么在 C 中绑定(bind)套接字时需要地址长度参数?

标签 c sockets system-calls

我开始在 C 中使用套接字,当我使用 bind() 系统调用将套接字绑定(bind)到地址时,我必须指定 addrlen 参数。

为什么套接字中需要地址长度?

最佳答案

绑定(bind)函数(系统调用)是通用函数,它必须处理多种类型的地址,IPv4、IPv6、蓝牙、unix 套接字和...每种地址类型的大小可能与其他类型不同,因此您必须创建它通过传递其大小清除绑定(bind)您要传递的地址。

bind 是一个系统调用,系统调用只是一个包装函数,在用户空间中用于与内核空间交互。当您通过套接字系统调用创建套接字时,将在调用进程的文件描述符表中创建一条记录。记录本身包括套接字的类型。 当你调用 bind 并将地址传递给它时,地址应该被复制到内核空间,但是地址有多大? bind 系统调用不知道您正在绑定(bind)的套接字,因为在内核空间和用户空间绑定(bind)函数中创建的套接字记录及其各自的系统调用不知道它需要的大小。实际上,绑定(bind)只是系统调用,它将地址数据复制到内核空间并通知内核。

另一方面,绑定(bind)无法在运行时确定地址时间,因为纯 C 中没有运行时类型检查。

所以此时绑定(bind)不知道地址,你应该指定地址大小,这样地址结构将被完整地复制到内核空间。

关于c - 为什么在 C 中绑定(bind)套接字时需要地址长度参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41240492/

相关文章:

c - 在子进程中操作流

c - X11:如何让一个窗口一个接一个地移动?

java - 为什么 Java 从套接字中读取随机数量而不是整个消息?

c# - 取决于服务代理的 TCP 套接字服务器,我如何接收整个消息并发送响应?

C程序使用不在循环中工作的系统调用从文件中读取替代字符

unix - 在 unix 环境中拦截系统调用的可能方法有哪些?

c++ - 我的 Arduino 串行命令行不起作用,我不知道为什么

c++ - 我可以在仅支持 2.1 的卡中对 OpenGL4+ 进行编程吗?

Java 代理 - 无法正确交换来自 HTTP GET/POST 请求的数据

multithreading - 在多线程(使用克隆)程序中调试段错误