- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
为 addr 参数传递的实际结构将取决于地址族。 sockaddr 结构定义如下:
struct sockaddr {
sa_family_t sa_family;
char sa_data[14];
}
因此对于 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 */
};
绑定(bind)代码是否读取了 sockaddr.sa_family
值,并根据找到的值将 sockaddr
结构转换为适当的结构,例如 sockaddr_in
?
为什么 sa_data
设置为 14 个字符?如果我理解正确,sa_data
字段只是一个具有足够大内存空间以适应所有地址族类型的字段?据推测,最初的设计者预计 14 个字符的宽度足以适应所有 future 的类型。
最佳答案
根据glibc manual :
The length 14 of sa_data is essentially arbitrary.
还有 FreeBSD developers handbook提到以下内容:
Please note the vagueness with which the sa_data field is declared, just as an array of 14 bytes, with the comment hinting there can be more than 14 of them.
This vagueness is quite deliberate. Sockets is a very powerful interface. While most people perhaps think of it as nothing more than the Internet interface—and most applications probably use it for that nowadays—sockets can be used for just about any kind of interprocess communications, of which the Internet (or, more precisely, IP) is only one.
是的,sa_family
字段用于识别如何处理传递的结构(在绑定(bind)调用中转换为 struct sockaddr*
)。您也可以在 FreeBSD developers handbook 中阅读更多关于它如何工作的信息。 .
而且实际上还有sockaddr
的“多态”(子)类型,其中sa_data
包含超过16个字节,例如:
struct sockaddr_un {
sa_family_t sun_family; /* AF_UNIX */
char sun_path[108]; /* pathname */
};
关于c - sockaddr 中 sa_data 字段的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32624847/
我想获取连接到我的服务器套接字的套接字的 IP 地址。我已经包含了我的代码。 sa_data 不返回类型为“xxx.xxx.xxx.xxx”的 char[14]。相反,它返回 [11][1][xxx]
我在 Mac OS X 中做了一些干预(本质上是拦截 C 调用),我注意到 ping 应用程序试图调用 addrlen 值为 16 的 sendto 函数。在 sys/socket.h 中我可以清楚地
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 为 addr 参数传递的实际结构将取决于地址族。 socka
根据https://stackoverflow.com/a/5328190 , 我可以用 std::string ip ="192.168.1.54"; std::stringstream s(ip)
获取方式: printf(" %02x:%02x:%02x:%02x:%02x:%02x", (unsigned char)item->ifr_hwaddr.sa_data[0], (unsigned
在我的 C++ 应用程序中,我使用了 sockaddr。我想查看 sockaddr.sa_data[14] 持有的所有信息。现在我只打印 sa_data[2].sa_data[3].sa_data[4
getaddrinfo() 填充 struct addrinfo,其中实际打包地址存储在 struct sockaddr *ai_addr 字段中。 struct sockaddr 的字段 char
我有以下简单的方法: const QString& UeNetworkManager::ueAccessPointMACAddress(const QString& interfaceName) co
我需要从 ifr 结构给出的 buffer.ifr_hwaddr.sa_data[s] 格式获取 u_char[6] 格式的路由器 MAC 地址。 最佳答案 也许这就是你想要的 for( s = 0;
我是一名优秀的程序员,十分优秀!