Socket的系统调用Bind In c

时间:2011-05-31 08:37:22

标签: c sockets

我在接受采访时被问到为什么需要计算绑定系统调用中绑定的地址大小。

bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr))

意味着我想知道在绑定系统调用中有第三个参数的目的是什么?

3 个答案:

答案 0 :(得分:2)

因为sockaddr结构或多或少地作为“派生”结构(如sockaddr_in)的“基础”结构。它几乎是继承机制。

sockaddr包含可由sockaddr_*等“派生”结构使用的可变长度数据,因此您需要精确确定“派生”结构的有效大小。

答案 1 :(得分:1)

C调用通常需要传递给它们的数据大小作为参数,这就是所有结构所做的事情,否则,当从结构中读取数据时,内部函数可能会尝试读取结构的边界,我们都知道这很糟糕。

答案 2 :(得分:1)

这是一张支票。类型信息不会传递给函数,因此它使用大小来验证结构是否可能是正确的类型,或者至少足够大以至于它不会写入越界内存。

它也是一种面向未来的形式:如果结构的更高版本具有更多字段并强制结构的大小增加,则接收调用可以区分旧/新并且仅填充可能的数据量不用担心写出界外。