ip地址的转换总是让人头大,整合到一起看吧
1、inet_addr:点分十进制的IP地址字符串转化为unsigned int(网络字节序)
#include <arpa/inet.h>
struct in_addr
{
in_addr_t s_addr;
}
//in_addr_t 一般为 32位的unsigned int,其字节顺序为网络顺序network byte ordered
//可以理解为就是转为unint32类型
in_addr_t inet_addr(const char* strptr);
in_addr myaddr;
myaddr.s_addr = inet_addr("172.18.29.32");
2、inet_aton:将一个字符串IP地址转换为一个32位的网络序列IP地址。如果这个函数成功,函数的返回值非零,如果输入地址不正确则会返回零。
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
完整描述:
int inet_aton(const char *string, struct in_addr*addr);
struct sockaddr_in
{
/*Address family一般来说AF_INET(地址族)PF_INET(协议族)*/
short sin_family;
//Port number(必须要采用网络数据格式,普通数字可以用htons()函数转换
unsigned short sin_port;
/*IP address in network byte order(Internet address)*/
struct in_addr sin_addr;
/*Same size as struct sockaddr没有实际意义,只是为了跟SOCKADDR结构在内存中对齐*/
unsigned char sin_zero[8];
};
struct sockaddr_in s_addr;
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(8000);
inet_aton("127.0.0.1", &s_addr.sin_addr);
3、inet_ntoa:将网络地址转换成“.”点隔的点分十进制IP地址字符串格式
#include <arpa/inet.h>
char *inet_ntoa(struct in_addr in);
#include <stdio.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
int main()
{
struct in_addr addr1,addr2;
addr1.s_addr = inet_addr("10.67.68.60");
addr2.s_addr = inet_addr("10.1.1.10");
printf("%s %s\n", inet_ntoa(addr1), inet_ntoa(addr2));
printf("addr1: %s\n", inet_ntoa(addr1));
printf("addr2: %s\n", inet_ntoa(addr2));
return 0;
}
10.67.68.60 10.67.68.60
addr1: 10.67.68.60
addr2: 10.1.1.10
inet_ntoa返回一个char *,而这个char *的空间是在inet_ntoa里面静态分配的,所以inet_ntoa后面的调用会覆盖上一次的调用。第一句printf的结果只能说明在printf里面的可变参数的求值是从右到左的,仅此而已。
4、inet_ntop:用于将网络字节序的IPv4或IPv6地址转换成文本表示形式(即点分十进制表示法)。它是inet_ntoa函数的升级版本,它支持IPv4和IPv6地址,而inet_ntoa只支持IPv4地址。
int inet_pton(int af, const char *src, void *dst);
const char * inet_ntop(int af, const void * src, char * dst, socklen_t size);
它有四个参数:
1. af:地址族,可以是AF_INET(IPv4)或AF_INET6(IPv6)
2. src:指向指定地址族的IP地址的指针( in_addr)
3. dst:指向存储文本表示形式的IP地址的缓冲区的指针(字符串)
4. size:缓冲区大小
#include <stdio.h>
#include <arpa/inet.h>
int main()
{
char ip_addr[32] = {0};
struct in_addr st_ip;
inet_pton(AF_INET, "10.67.68.80", &st_ip);
inet_ntop(AF_INET, &st_ip, ip_addr, sizeof(ip_addr));
printf("ip_addr: %s\n", ip_addr);
return 0;
}
ip_addr: 10.67.68.80