一、IP地址有两种格式
1、ASCII表示,为点分十进制字符串格式,IPv4 numbers-and-dots notation
如196.168.1.1
2、整数表示,binary data
如 196.168.1.1转换为整数形式,是3232235777
196.168.1.1 -> C0.A8.01.01 -> C0A80101 -> 3232235777
二、表示结构体
1、struct in_addr { in_addr_t s_addr; };
表示一个32位十六进制表示的IPv4地址。in_addr_t 一般为32位的unsigned int,其字节顺序为网络字节序,即该无符号数采用大端字节序。其中每8位表示一个IP地址中的一个数值。
2、struct sockaddr {
u_short sa_family; /* address family,常为AF_INET,代表Internet(TCP/IP)地址族 */
char sa_data[14]; /* up to 14 bytes of direct address,包含IP地址和端口号 */
};
sockaddr是通用的socket地址结构体。
3、struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8]; /* 目的是填充至与struct sockaddr 相同长度 */
};
sockaddr_in是Internet 和socket通用的地址结构体。
三、格式转换函数
1、in_addr_t inet_network(const char *cp);
可将字符串形式转换为整数形式,返回的整数形式是主机字节序;
2、in_addr_t inet_addr(const char *cp);
可将字符串形式转换为无符号长整型用的,返回的整数形式是网络字节序;
struct sockaddr_in inaddr;
inaddr.sin_addr.s_addr = inet_addr("132.241.5.10");
3、int inet_aton(const char *cp, struct in_addr *inp);
上述两个函数识别255.255.255.255地址为无效地址(历史原因),而inet_aton识别255.255.255.255是有效的,返回的是网络字节序的IP地址。
4、char *inet_ntoa(struct in_addr in);
长整型转换成字符串格式;
返回IP字符串,如 "132.241.5.10"
5、int inet_pton(int af, const char *src, void *dst);
将IP地址从字符串格式转换成网络地址格式,支持IPV4和IPV6
af:协议族
src:指向IP地址字符串
dst:指向网络地址的结构体
6、htonl()
将32位的主机字节顺序转化为32位的网络字节顺序。
7、htons()
将16位的主机字节顺序转化为16位的网络字节顺序。
(ip地址是32位的,端口号是16位的 )