C/C++知识点之网络编程中重要的几个数据结构和函数
小标 2018-08-10 来源 : 阅读 1624 评论 0

摘要:本文主要向大家介绍了C/C++知识点之网络编程中重要的几个数据结构和函数,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之网络编程中重要的几个数据结构和函数,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

IPv4相关结构:

struct in_addr
{
    in_addr_t          s_addr;  //表示32位的IP地址,32位无符号整型
}

struct sockaddr_in
{
    uint8_t            sin_len;       //表示该结构体的长度,8位无符号整型
    sa_family_t        sin_family;    //表示套接口使用的协议族,8位无符号整型
    in_port_t          sin_port;      //表示套接口使用的端口号,16位无符号整型
    struct in_addr     sin_addr;      //表示IP地址,32位无符号整型
    char               sin_zero[8];   //该成员基本不使用,总是置为0
}
sin_len成员是不要求一定存在的,即便这个成员存在,也无需设置它或者检查它。换句话说就是一般情况下,我们用不到这个成员。

sin_family,sin_addr,sin_port这三个成员是必须的。并且几乎所有的实现都增加了sin_zero成员。

sin_family的类型与sin_len成员有关,如果结构体中定义了成员sin_len,那么sin_family一般就是8位无符号整型。

如果结构体中没有定义成员sin_len,那么sin_family一般就是16位无符号整型,这样一来整个结构体的大小至少是16字节(1+1+2+4+8)。

IPv6相关结构:

struct in6_addr
{
    unit8_t              s6_addr[16]; //表示128位的IP地址,这里采用数组的形式  
}

struct sockaddr_in6
{
    uint8_t              sin6_len;         //表示该结构体的长度,8位无符号整型
    sa_family_t          sin6_family;      //表示套接口使用的协议族,8位无符号整型
    in_port_t            sin_port;         //表示套接口使用的端口号,16位无符号整型
    uint32_t             sin_flowinfo;     //低序20位是流标签,高序12位保留
    struct in6_addr      sin6_addr         //表示128位的IP地址
    uint32_t             sin6_scope_id;    //标识对于具备范围的地址而言有意义的范围
}
28个字节
通用套接口地址结构:

struct sockaddr
{
    uint8_t              sa_len;
    sa_family_t          sa_family;
    char                 sa_data[14];        //表示14字节的协议地址

}
当作为参数传递给任一个套接口函数时,套接口地址结构总是通过指针来传递,但通过指针来取得此参数的套接口函数必须处理来自所支持的任何协议族的套接口地址结构。因此通过定义sockaddr来获取不同的套接口地址结构。
大小16个字节
新的通用套接口地址结构:

struct sockaddr_storage
{
    uint8_t              ss_len;             //表示该结构的长度
    sa_family_t          ss_family;          //表示协议族
    char __ss_padding[_SS_PADSIZE];          
}
原有的通用数据结构sockaddr只有16个字节,无法兼容ipv6格式,sockaddr_storage足够大,可以容纳任何套接字接口地址
sockaddr_storage 能满足最苛刻的对齐要求
想使用sockaddr_storage中,除了ss_len和ss_family外的其他字段,必须强制转换成其他类型(如sockaddr),再获取。
inet_pton和inet_ntop函数
这两个是随ipv6一起出现的新函数,支持ipv4和ipv6,函数名称中p的意思是表达(presentation),n的意思是数值(numeric),表达是ACSII字符串,数值是内存里的二进制值,顾名思义,inet_pton,将字符串转为数值,inet_ntop,将数值转为字符串。

#include <arpa/inet.h>
int inet_pton(int family, const char *strptr, void *addrstr); //成功返回1,strptr格式错误返回0,失败返回-1
const char *inet_ntop(int family, const void *addrstr, char *strptr, size_t len); //成功则返回指向结果的指针,失败返回NULL
family参数根据协议族的不同,选择AF_INET或AF_INET6
inet_pton 将strptr指向的字符串,转为数值,存放在addstr指向的内存中
inet_ntop 做相反的运算,len参数是strptr单元的大小,防止溢出。为有助于指定大小,C语言中有做如下定义。
#incldue <arpa/inet.h>
#define INET_ADDRSTRLEN    16
#define INET6_ADDRSTRLEN   46    

本文由职坐标整理并发布,了解更多内容,请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved