【问题标题】:Socket's system call Bind In cSocket的系统调用Bind In c
【发布时间】:2011-05-31 08:37:22
【问题描述】:

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

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

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

【问题讨论】:

    标签: c sockets


    【解决方案1】:

    因为sockaddr 结构或多或少充当sockaddr_in 等“派生”结构的“基础”结构。这几乎是一种继承机制。

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

    【讨论】:

    • 为什么需要精确度@Heandel??
    【解决方案2】:

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

    【讨论】:

    • 谢谢@Johnathon,但你能用更简单的方式解释一下吗?
    • C 中没有出现 OutOfBounds 异常。您只是读取了一些不正确的数据。所以最好有一个结构的大小。只是为了验证您从正确的位置阅读
    • 感谢@Oleg,您的 cmets 很有帮助!
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 2011-11-16
      • 2013-01-03
      • 2016-02-09
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      • 2012-12-23
      相关资源
      最近更新 更多