【发布时间】:2011-05-31 08:37:22
【问题描述】:
我在一次采访中被问到为什么需要在 bind 系统调用中计算绑定地址的大小。
bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr))
意思是我想知道在绑定系统调用中有第三个参数的目的是什么??
【问题讨论】:
我在一次采访中被问到为什么需要在 bind 系统调用中计算绑定地址的大小。
bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr))
意思是我想知道在绑定系统调用中有第三个参数的目的是什么??
【问题讨论】:
因为sockaddr 结构或多或少充当sockaddr_in 等“派生”结构的“基础”结构。这几乎是一种继承机制。
sockaddr 包含可变长度的数据,这些数据可供sockaddr_* 等“派生”结构使用,因此您需要精确“派生”结构的有效大小。
【讨论】:
C调用通常需要作为参数传递给它们的数据的大小,这就是结构所做的一切,否则,当从结构读取数据时,内部函数可能会尝试读取结构的边界,我们都知道这很糟糕。
【讨论】:
这是一张支票。类型信息不会传递给函数,因此它使用大小来验证结构是否可能是正确的类型,或者至少足够大以至于不会写入越界内存。
这也是一种面向未来的形式:如果结构的更高版本具有更多字段并迫使结构增大大小,则接收调用可以区分新旧并仅填写可能的数据量不用担心写越界。
【讨论】: