博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网络编程中重要的几个数据结构和函数
阅读量:6860 次
发布时间:2019-06-26

本文共 2380 字,大约阅读时间需要 7 分钟。

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 
int inet_pton(int family, const char *strptr, void *addrstr); //成功返回1,strptr格式错误返回0,失败返回-1const 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 
#define INET_ADDRSTRLEN 16#define INET6_ADDRSTRLEN 46

转载地址:http://alxyl.baihongyu.com/

你可能感兴趣的文章
Realm为Node.js发布对象数据库
查看>>
物联网行业将掀起新一轮并购潮 步入整合期
查看>>
夏日炎炎 构筑安防线 这些知识你Get到了吗?
查看>>
《C语言程序设计:问题与求解方法》——2.4节C语言源程序的次要组成成分:编译预处理命令、注释和声明...
查看>>
业绩不佳引裁员 雅虎2016有点烦
查看>>
《Hadoop实战第2版》——导读
查看>>
德国为新能源付出了哪些巨大的代价?
查看>>
探讨医疗人工智能之眼科AI的真实应用场景(肽积木CEO柏文洁)丨硬创公开课...
查看>>
中冶集团首度亮相智博会 探索“智慧城市的智慧地下”
查看>>
思科:6成物联网计划仍处于概念验证阶段
查看>>
远离个人信息裸奔伤害
查看>>
Orange将“鸡蛋”放入ECOMP的篮子
查看>>
大数据看AI人才分布:美国领先,中国培养潜能大
查看>>
光伏产业还值不值得继续关注?
查看>>
三星三季移动DRAM市场份额创新高,达64.5%
查看>>
智能楼宇中的安防监控系统
查看>>
中科联想身份认证云服务联合实验室在北京揭牌
查看>>
Winform 通用分页控件实战篇(提供源码下载)
查看>>
云计算对数据中心行业未来发展的影响
查看>>
大数据时代 将会发生哪些变化?
查看>>