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);吗?
它应该这样调用:
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