理解struct sockaddr

33
struct sockaddr {
    unsigned short sa_family;   // address family, AF_xxx
    char           sa_data[14]; // 14 bytes of protocol address
};
在这个结构中,sa_family 所表示的地址族的确切含义是什么?
这是否意味着像 TCP/UDP 这样的协议具有“地址”?好吧,这些协议可以是标识号而不是地址,我想。
无论如何,如果是的话,它们的家族是基于什么分割的?
2个回答

31

地址的格式和大小通常取决于协议的特定要求。

sockaddr 作为一组地址结构的基础,类似于一个带有区分联合体的数据类型,请参考 Beej指南。您通常需要查看 sa_family 并强制转换为相应地址族的特定地址结构。

TCP 和 UDP 没有特定的地址,而是在 IP 层具有不同大小的 IPv4 和 IPv6 地址。

另见:


1
请参阅 http://msdn.microsoft.com/en-us/library/ff570822%28v=vs.85%29.aspx。该文档指出 sockaddr 结构足够大,可以容纳大多数地址族的传输地址。因此,它需要14个字节来使其足够大。 - O.C.
5
不 - IPv6地址是16字节。过去它是一个任意的最大值,但这只是为了方便而非硬性限制。 - Remy
2
MSDN对于Posix并不具有权威性。请参考Posix规范,而非供应商特定的文档:http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_socket.h.html和http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/netinet_in.h.html。 - Michael Beer
1
特别注意,sa_data 没有最小大小的保证。如果您需要空间来保存任何受支持的 sockaddr 实例,则应使用 sockaddr_storage - Michael Beer
1
Beej的工作链接为http://beej.us/guide/bgnet/html/#structs。 - Nilesh Deokar
显示剩余3条评论

-1

我在尝试在C/C++中复制jnetpcap getHardwareAddress()方法时发现了这一点。当sa_family为17(0x11,AF_PACKET)时,MAC地址包含在字节10-15中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接