Chr*_*now 7 c sockets struct network-programming bind
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
Run Code Online (Sandbox Code Playgroud)
为addr参数传递的实际结构将取决于地址族.sockaddr结构定义为:
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
}
Run Code Online (Sandbox Code Playgroud)
因此,对于IPv4地址(AF_INET),将传递的实际结构如下:
/* Source http://linux.die.net/man/7/ip */
struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order */
struct in_addr sin_addr; /* internet address */
};
/* Internet address. */
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};
Run Code Online (Sandbox Code Playgroud)
绑定代码是否读取sockaddr.sa_family值并根据它找到的值,然后将sockaddr结构转换为适当的结构,例如sockaddr_in?
为什么sa_data设置为14个字符?如果我理解正确,那么该sa_data字段只是一个具有足够大的内存空间以适合所有地址族类型的字段?据推测,原始设计师预计14个字符的宽度足以适合所有未来类型.
根据glibc手册:
sa_data的长度14基本上是任意的.
而FreeBSD开发者手册中提到的情况如下:
请注意声明sa_data字段的模糊性,就像14个字节的数组一样,注释提示可以有超过14个字节.
这种模糊是非常刻意的.套接字是一个非常强大的接口.虽然大多数人可能认为它只不过是互联网接口 - 大多数应用程序现在可能会使用它 - 套接字可以用于几乎任何类型的进程间通信,其中Internet(或更确切地说是IP)只有一个.
是的,该sa_family字段用于识别如何处理传递的结构(struct sockaddr*在调用bind时强制转换).您可以在FreeBSD开发人员手册中阅读有关其工作原理的更多信息.
实际上有"多态"(子)类型sockaddr,其中sa_data包含超过16个字节,例如:
struct sockaddr_un {
sa_family_t sun_family; /* AF_UNIX */
char sun_path[108]; /* pathname */
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7243 次 |
| 最近记录: |