SOCKADDR_IN结构中的sin_family ,sin_addr各是什么具体意思?有什么区别?最好讲得通俗点,谢谢各位高手

2024-12-12 19:08:35
推荐回答(2个)
回答1:

sin_family表示协议簇,一般用AF_INET表示TCP/IP协议。
sin_addr是一个联合体,用联合体就可以使用多种方式表示IP地址。一般我们使用其中的最后一种方式,即用无符号长整型数据来表示IP地址。此时,用的是s_nu数据成员,s_un是一个结构体,其中只有一个数据成员,即s_addr。
使用方式:
变量.sin_family=AF_INET;
变量.sin_addr.S_un.S.addr=htonl("IP地址");

回答2:

先贴上头文件内的定义;
struct sockaddr_in
{
__kernel_sa_family_t sin_family; /* Address family */
__be16 sin_port; /* Port number */
struct in_addr sin_addr; /* Internet address */
/* Pad to size of `struct sockaddr'. */
unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) -
sizeof(unsigned short int) - sizeof(struct in_addr)];
};

/* Internet address. */
struct in_addr 
{
__be32 s_addr;
};


区别:
把结构体内对应的这些位,填上IPv4的010101010101,然后计算机就能识别,你这个是IPv4
sturct sockaddr_in server_addr.sin_family = AF_INET;

这个是IP地址,并且要复合上面设置的sin_family类型(IPv4 or IPv6),
htonl()把字符串(127.0.0.1)转换成01010101010101这样的二进制
htonl()也可以跟宏,另外这里又牵涉到大端,小端的问题,自行去查资料,不说了
sturct sockaddr_in server_addr.sin_addr.s_addr = htonl(INADDE_ANY);

*友情提示:在使用这个结构体前,

最好先 bzero((struct sockaddr * )&server_addr, size_t addrlen);//所有位致0

因为,后面IPv4 结构体 struct sockaddr_in 后面有8个字节的填充位,你不致0,会出现一些毛病