为什么在 C 中绑定套接字时需要地址长度参数?
Why is the address length parameter neccessary when binding a socket in C?
我开始在 C 中使用套接字,当我使用 bind() 系统调用将套接字绑定到地址时,我必须指定 addrlen 参数。
为什么套接字需要地址长度?
有几种不同类型的套接字地址
这些都有自己的 sockaddr_*
结构,即 sockaddr_in
代表 AF_INET
,sockaddr_in6
代表 AF_INET6
,等等
传递长度允许内核检查传递的数据是否与套接字类型一致。
绑定函数(系统调用)是通用函数,它必须处理多种类型的地址,IPv4、IPv6、蓝牙、unix 套接字和...每种地址类型的大小可能与其他地址类型不同,因此您必须通过传递大小来明确绑定您要传递的地址。
bind 是一个系统调用,系统调用只是一个包装函数,在用户space 中用于与内核space 交互。当您通过套接字系统调用创建套接字时,将在调用进程的文件描述符 table 中创建一条记录。记录本身包括套接字的类型。
当你调用 bind 并将地址传递给它时,地址应该被复制到内核 space,但是地址有多大? bind 系统调用不知道您正在绑定的套接字,因为在内核 space 和 userspace 绑定函数中创建的套接字记录及其各自的系统调用不知道它需要的大小。实际上,绑定只是系统调用,它将地址数据复制到内核 space 并通知内核。
另一方面,绑定无法在运行时确定地址时间,因为纯 C 中没有运行时类型检查。
所以此时绑定不知道地址,您应该指定地址大小,这样地址结构将完全复制到内核space。
系统调用协议独立,例如它们适用于
- IPv4 (sockaddr_in)
- IPv6 (sockaddr_in6)
- Unix 域套接字 (sockaddr_un)
所有这些都可能有不同长度的套接字描述。这就是为什么你必须指定相应结构的长度。
bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr))
它有三个参数,套接字文件描述符,绑定地址,大小它绑定的地址
为什么套接字需要地址长度?
Its a limit in which it is bound
例如我会处理如下
if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
{
error("ERROR on binding");
}
我开始在 C 中使用套接字,当我使用 bind() 系统调用将套接字绑定到地址时,我必须指定 addrlen 参数。
为什么套接字需要地址长度?
有几种不同类型的套接字地址
这些都有自己的 sockaddr_*
结构,即 sockaddr_in
代表 AF_INET
,sockaddr_in6
代表 AF_INET6
,等等
传递长度允许内核检查传递的数据是否与套接字类型一致。
绑定函数(系统调用)是通用函数,它必须处理多种类型的地址,IPv4、IPv6、蓝牙、unix 套接字和...每种地址类型的大小可能与其他地址类型不同,因此您必须通过传递大小来明确绑定您要传递的地址。
bind 是一个系统调用,系统调用只是一个包装函数,在用户space 中用于与内核space 交互。当您通过套接字系统调用创建套接字时,将在调用进程的文件描述符 table 中创建一条记录。记录本身包括套接字的类型。 当你调用 bind 并将地址传递给它时,地址应该被复制到内核 space,但是地址有多大? bind 系统调用不知道您正在绑定的套接字,因为在内核 space 和 userspace 绑定函数中创建的套接字记录及其各自的系统调用不知道它需要的大小。实际上,绑定只是系统调用,它将地址数据复制到内核 space 并通知内核。
另一方面,绑定无法在运行时确定地址时间,因为纯 C 中没有运行时类型检查。
所以此时绑定不知道地址,您应该指定地址大小,这样地址结构将完全复制到内核space。
系统调用协议独立,例如它们适用于
- IPv4 (sockaddr_in)
- IPv6 (sockaddr_in6)
- Unix 域套接字 (sockaddr_un)
所有这些都可能有不同长度的套接字描述。这就是为什么你必须指定相应结构的长度。
bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr))
它有三个参数,套接字文件描述符,绑定地址,大小它绑定的地址
为什么套接字需要地址长度?
Its a limit in which it is bound
例如我会处理如下
if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
{
error("ERROR on binding");
}