网络编程中重要的几个数据结构和函数

简介: IPv4相关结构:struct in_addr{ in_addr_t s_addr; //表示32位的IP地址,32位无符号整型}struct sockaddr_in{ uint8_t sin_len; //表示该结构...

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
目录
相关文章
|
2月前
|
算法 安全 网络安全
数据结构之网络攻击路径(深度优先搜索)
本文介绍了如何使用深度优先搜索(DFS)算法分析网络攻击路径。在网络安全领域,DFS用于检测网络中潜在的攻击路径,帮助安全人员及时发现并阻止威胁。文中详细描述了网络图的构建、节点间的连接关系以及DFS的实现过程。通过一个具体的例子,展示了如何检测从一个普通节点到关键节点的攻击路径,并讨论了DFS算法的优缺点。提供的C++代码实现了网络图的构建和攻击路径的检测功能。
75 24
用MASM32按Time Protocol(RFC868)协议编写网络对时程序中的一些有用的函数代码
用MASM32按Time Protocol(RFC868)协议编写网络对时程序中的一些有用的函数代码
|
2月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
68 4
|
2月前
|
算法
数据结构之卫星通信网络(BFS)
本文介绍了卫星通信网络及其重要性,并探讨了广度优先搜索(BFS)算法在其中的应用。卫星通信网络通过在轨卫星提供全球覆盖的通信服务,尤其在偏远地区和紧急救援中发挥关键作用。BFS算法用于网络拓扑分析、路径规划和故障排除,确保通信网络的高效运行。文章还包括BFS算法的工作原理、特点、优缺点及其实现代码示例。
64 1
|
2月前
|
算法 数据中心
数据结构之数据中心网络路由(BFS)
本文介绍了数据中心网络路由中使用广度优先搜索(BFS)算法的重要性及其应用。随着数据中心从集中式大型机系统发展到分布式架构,高效的数据路由成为确保低延迟、高吞吐量和网络可靠性的关键。BFS通过系统地探索网络层次,从源节点开始向外遍历,确保发现最短路径,特别适合于数据中心网络环境。文中还提供了BFS算法的具体实现代码,展示了如何在数据中心网络中应用该算法来查找节点间的最短路径,并讨论了BFS的优缺点。
55 0
数据结构之数据中心网络路由(BFS)
|
2月前
|
存储 算法 UED
数据结构之网络流量路径分析(BFS)
网络流量路径分析利用BFS算法在网络图中寻找从源节点到目标节点的最短路径,帮助识别网络瓶颈、优化数据流,提升网络性能。本示例通过构建一个无向图,展示了如何使用BFS算法进行路径分析,找到从节点0到节点5的有效路径,验证了算法的实用性和有效性。
65 0
|
7月前
|
存储 消息中间件 缓存
Redis系列学习文章分享---第十七篇(Redis原理篇--数据结构,网络模型)
Redis系列学习文章分享---第十七篇(Redis原理篇--数据结构,网络模型)
118 0
|
3月前
|
机器学习/深度学习 编解码
深度学习笔记(三):神经网络之九种激活函数Sigmoid、tanh、ReLU、ReLU6、Leaky Relu、ELU、Swish、Mish、Softmax详解
本文介绍了九种常用的神经网络激活函数:Sigmoid、tanh、ReLU、ReLU6、Leaky ReLU、ELU、Swish、Mish和Softmax,包括它们的定义、图像、优缺点以及在深度学习中的应用和代码实现。
297 0
深度学习笔记(三):神经网络之九种激活函数Sigmoid、tanh、ReLU、ReLU6、Leaky Relu、ELU、Swish、Mish、Softmax详解
|
3月前
|
机器学习/深度学习 数据可视化 算法
激活函数与神经网络------带你迅速了解sigmoid,tanh,ReLU等激活函数!!!
激活函数与神经网络------带你迅速了解sigmoid,tanh,ReLU等激活函数!!!
|
5月前
|
机器学习/深度学习 算法
神经网络中激活函数的重要性
【8月更文挑战第23天】
83 0

热门文章

最新文章