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

 我来答
YaChin
推荐于2018-08-29 · TA获得超过134个赞
知道答主
回答量:13
采纳率:100%
帮助的人:9.3万
展开全部
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地址");
592008636
2017-06-29 · TA获得超过1195个赞
知道小有建树答主
回答量:176
采纳率:0%
帮助的人:175万
展开全部
先贴上头文件内的定义;
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,会出现一些毛病

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式