设为首页 加入收藏

TOP

IPv4地址结构体sockaddr_in详解
2018-10-22 00:10:03 】 浏览:27
Tags:IPv4 地址 结构 sockaddr_in 详解



sockaddr_in结构体定义

struct sockaddr_in
{
    sa_family_t         sin_family;        //地址族(Address Family)
    uint16_t              sin_port;          //16位TCP/UDP端口号
    struct in_addr     sin_add;          //32位IP地址
    char                    sin_zero[8];     //不使用
};

struct in_addr
{
    In_addr_t            s_addr;            //32位IPv4地址
};

1.成员sin_family

地址族(Address Family) 含义
AF_INET IPv4网络协议中使用的地址族
AF_INET6 IPv6网络协议中使用的地址族
AF_LOCAL 本地通信中采用的Unix协议的地址族

2.成员sin_port

该成员保存16位端口号,重点在于,他以网络字节序保存。

3.成员sin_addr

该成员保存32位IP地址信息,且也以网络字节序保存。

4.成员sin_zero

无特殊含义。只是为了使结构体sockaddr_in的大小与sockaddr结构体保持一致而插入的成员。必须填充为0,否则无法得到想要的结果。

下面给出sockaddr_in结构体传递给bind()函数的代码

struct sockaddr_in serv_addr
....
if( bind(serv_sock, (struct sockaddr *) &serv_addr), sizeof(serv_addr) == -1 )
    //错误处理
....

请注意第二个参数将sockaddr_in类型转换为sockaddr类型。因为bind()函数需要一个sockaddr类型的参数,但是直接向sockaddr结构体填充地址族、端口号、IP地址等信息不太容易,而填充sockaddr_in类型结构体则容易得多,故先填充sockaddr_in再将其转换为sockaddr类型。

下面给出sockaddr结构体定义。

struct sockaddr
{
    sa_family_t        sin_family;        //地址族(Address Family)
    char                   sa_data[14];     //地址信息
}

此结构体成员sa_data保存的地址信息中需包含IP地址和端口号,剩余部分应填充0,这也是bind()函数要求的。而这对于包含地址信息来讲非常麻烦,继而就有了结构体sockaddr_in。若按照之前讲解的填写好sockaddr_in结构体,则将生产负荷bind()函数要求的字节流。最后转换为sockaddr类型的结构体变量,再传递给bind()函数即可。

会不会有这样的疑问,sockaddr_in是保存IPv4地址信息的结构体,那为何还需要通过sin_family单独指定地址族信息呢?这与sockaddr结构体有关。结构体sockaddr并非只为IPv4设计的。这从保存地址信息的数组sa_data长度为14字节也可看出。因此,结构体sockaddr要求在sin_family中指定地址族信息。为了与sockaddr保持一致,sockaddr_in结构体中也有地址族信息。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【模板】最短路 下一篇洛谷P1291 [SHOI2002]百事世界杯..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目