言之者无罪,闻之者足以戒。 - “诗序”、
1、网络字节序:
在TCP的编写过程中需要从网络字节序转换到主机字节序,当然也需要从主机字节序转换到网络字节序
htons 把 unsigned short类型从主机序转换到网络序
htonl把unsigned long类型从主机序转换到网络序
ntohs把unsigned short类型从网络序转换到主机序
ntohl把unsigned long类型从网络序转换到主机序
2、套接字的地址结构:
(1)、通用地址结构:
struct sockaddr{
sa_family_t sa_family;
char sa_data[14];
}
(2)、不同的协议,IPv4/IPv6表示方法:
IPv4:
struct in_addr{
in_addr_t s_addr;
};
struct sockaddr_in{
sa_family_t sin_family;
int port_t sin_port;
struct in_addr sin_addr;
char sin_zero[0];
}
IPv6:
struct in6_addr{
in_addr_t s6_addr[16];
};
struct sockaddr_in6{
sa_family_t sin6_family;
int port_t sin6_port;
uint32_t sin6_flowinfo;
struct in_addr sin6_addr;
uint32_t sin6_scope_id;
}
3、IP地址转换的相关函数:
(1)inet_addr将一个点分十进制的IP转换成一个长整数型数
unsigned long inet_addr(const char* cp)
参数:cp代表点分十进制的IP地址,如1.2.3.4
(2) int inet_aton是将abcd形式的IP转换为32位的IP,存储在inp指针里面
int inet_aton(const char * cp,struct in_addr * inp)
第一个参数:包含ASCII表示的IP地址
第二个参数:将要用新的IP地址更新的结构
(3)inet_ntoa将32位IP转换为ABCD的格式
char * inet_ntoa(struct in_addr in)
参数:in代码in_addr的结构体
(4)inet_pton
inet_pton是一个IP地址转换函数,可以在将IP地址在“点分十进制”转换为“二进制整数”,而且inet_pton和inet_ntop这2个函数能够处理ipv4和ipv6。算是比较新的函数了。
int inet_pton(int af, const char *src, void *dst)
第一个参数:af是地址簇
第二个参数 :src是来源地址
第三个参数:* dst接收转换后的数据
(5)const char *inet_ntop
inet_ntop是一个IP地址转换函数,可以在将IP地址在“二进制整数”转换为“点分十进制”
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt)
第一个参数:af是地址簇
第二个参数 :src是来源地址
第三个参数:* dst接收转换后的数据
第四个参数:缓存区dst的大小