标签:ons 因此 其他 ipv4 通用 无法 void 出现 套接口
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)。
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; //标识对于具备范围的地址而言有意义的范围
}
struct sockaddr
{
uint8_t sa_len;
sa_family_t sa_family;
char sa_data[14]; //表示14字节的协议地址
}
struct sockaddr_storage
{
uint8_t ss_len; //表示该结构的长度
sa_family_t ss_family; //表示协议族
char __ss_padding[_SS_PADSIZE];
}
这两个是随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
#incldue <arpa/inet.h>
#define INET_ADDRSTRLEN 16
#define INET6_ADDRSTRLEN 46
标签:ons 因此 其他 ipv4 通用 无法 void 出现 套接口
原文地址:https://www.cnblogs.com/shenlinken/p/9385346.html