c - 为什么我们在调用 bind() 时将 sockaddr_in 转换为 sockaddr?

标签 c linux sockets

bind()函数接受一个指向 sockaddr 的指针,但在我见过的所有示例中,都使用了 sockaddr_in 结构,并被强制转换为 sockaddr :

struct sockaddr_in name;
...
if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0)
...

我无法理解为什么要使用 sockaddr_in 结构。为什么不直接准备并传递一个 sockaddr

只是约定俗成吗?

最佳答案

不,这不仅仅是惯例。

sockaddr 是任何类型的套接字操作的通用描述符,而 sockaddr_in 是特定于基于 IP 的通信的结构(IIRC,“in”代表“Internet ”)。据我所知,这是一种“多态性”:bind() 函数假装采用 struct sockaddr *,但实际上它会假设传入适当类型的结构;一世。 e.一个对应于您作为第一个参数提供的套接字类型。

关于c - 为什么我们在调用 bind() 时将 sockaddr_in 转换为 sockaddr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21099041/

相关文章:

c - 在 Xcode 中包含外部 C 库

c - 空元素导致 libxml 段错误

c++ - 处理客户端连接的最有效方式(套接字编程)

c - 如何在 [C] 中编写正确的循环

c - 如何将字符串的副本复制到适当大小的动态分配的字符数组中?

linux - 在 'for'循环中,如何通过另一个csv清理csv?

linux - GNOME 3 中 JetBrains 的 PyCharm 窗口中的不可见文本

c - PATH env 和 argv[0] 之间的关系

java - 解码在打开的套接字上挂起

sockets - JavaFX 套接字处理