争论功能

pus*_*gr8 6 c pointers arguments structure function

我对这个定义为函数的参数感到困惑

int bind(int s, const struct sockaddr *name, int namelen)
Run Code Online (Sandbox Code Playgroud)

并称为

bind(sd, (struct sockaddr_in *) &addr, length);
Run Code Online (Sandbox Code Playgroud)

我无法解释struct sockaddr_in *这里的含义.

这会有用bind (sd, &addr, length);吗?

iab*_*der 3

它应该这样调用:

bind (sd, (struct sockaddr *) &addr, length);
Run Code Online (Sandbox Code Playgroud)

至于为什么,如果你看看这些结构的定义,这就是 C 的多态性方式:

struct sockaddr {
    unsigned short    sa_family;    // address family, AF_xxx
    char              sa_data[14];  // 14 bytes of protocol address
};

// IPv4 AF_INET sockets:
struct sockaddr_in {
    short            sin_family;   // e.g. AF_INET, AF_INET6
    unsigned short   sin_port;     // e.g. htons(3490)
    struct in_addr   sin_addr;     // see struct in_addr, below
    char             sin_zero[8];  // zero this if you want to
};

// IPv6 AF_INET6 sockets:
struct sockaddr_in6 {
    u_int16_t       sin6_family;   // address family, AF_INET6
    u_int16_t       sin6_port;     // port number, Network Byte Order
    u_int32_t       sin6_flowinfo; // IPv6 flow information
    struct in6_addr sin6_addr;     // IPv6 address
    u_int32_t       sin6_scope_id; // Scope ID
};
Run Code Online (Sandbox Code Playgroud)

它们都共享相同的第一个成员,sa_family当您将指向其中一个结构的指针传递给bind()您时,首先将其强制转换struct sockaddr *为函数内部,sa_family用于确定您传递的结构并将其强制转换回正确的结构,而不是使用一个函数对于每个结构,您都有一个接受sockaddr*.

另一种看待它的方式是,从 OOP 的角度来看,想象它是和sockaddr的基类,并将指针传递给类似于转换为基类型并调用泛型函数。希望这能让它更清楚。sockaddr_insockaddr_in6sockaddr