1.网络字节序
TCP/IP协议规定,网络数据流采用大端字节序,即低地址高字节。为了使网络程序具有可移植性,使得同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。
#include<arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
h:host;n:network;l:32位长整数;s:16位短整数
如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回,如果主机是大端字节序,这些函数不做转换,将参数原封不动的返回。
2.IP地址转换函数
2.1 将IP地址转换为网络字节序
#include<arpa/inet.h>
int inet_pton(int af,const char *src,void *dst);
功能:将IPv4地址转换为网络字节序
参数:af:AF_INET或者AF_INET6,前一个是个IPv4地址,后一个适合IPv6地址;src:点分十进制的字符串;dst:写进网络字节序
2.2 将网络字节序转换为IP地址
#include<arpa/inet.h>
int inet_ntop(int af,const void *src,char *dst,socklen_t size);
功能: 将网络字节序转换为IP地址
参数::af:AF_INET或者AF_INET6,前一个是个IPv4地址,后一个适合IPv6地址;src:网络字节序;dst:返回字符串的指针的地址;size:字符串的大小
3.sockaddr数据结构
struct sockaddr
很多网络编程函数诞生于IPv4协议之前,那时候都是使用struct sockaddr
结构体,但是这个结构体逐渐被废弃,原struct sockaddr
演变成struct sockaddr_in
和struct sockaddr_in6
,但是很多函数内部仍然需要传递struct sockaddr
的地址,所以我们需要强制转换所需的地址类型。
struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order */
struct in_addr sin_addr; /* internet address */
};
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};
参数:sin_family::AF_INET或者AF_INET6;sin_port:端口号;sin_addr:IP地址