一尘不染

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

linux

绑定()函数接受一个指针sockaddr,但在我看到所有的实施例中,sockaddr_in结构来代替,并且被转换为sockaddr

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

我无法确定为什么要使用sockaddr_in结构。为什么不只是准备并通过sockaddr

这只是约定吗?


阅读 465

收藏
2020-06-02

共1个答案

一尘不染

不,不只是惯例。

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

2020-06-02