inet_addr()和inet_aton()函数详解
inet_addr()和inet_aton()这两个函数都将点分十进制格式的IPv4地址字符串转换为32位的网络字节序二进制值。
#include <arpa/inet.h>in_addr_t inet_addr(const char*string);
/*
传递点分十进制格式的字符串,将其转换为32位整数型数据并返回。该函数可检查无效的ip地址,填写大于255的地址数据,将返回INADDR_NONE。成功返回32位大端序整数型值。string:类似“192.168.1.1”的点分十进制格式的字符串*/int inet_aton(const char* string, struct in_addr*addr);
/*
成功时返回1(true),失败时返回0(false)。
string:类似“192.168.1.1”的点分十进制格式的字符串
addr:保存转换结果的in_addr结构体变量的地址值
、该函数可检查无效的ip地址,失败返回0.
*/inet_addr()和inet_aton()两个函数功能相同,都是将点分十进制类型的字符串转换为32位网络字节序并返回。只不过inet_aton()函数直接指定了返回的结构体地址值。
特性 | inet_addr() | inet_aton() |
---|---|---|
返回值 | 网络字节序的in_addr_t | 成功返回1,失败返回0 |
错误处理 | 返回INADDR_NONE(通常-1) | 返回0表示失败 |
处理255.255.255.255 | 可能失败(与错误值冲突) | 可以正确处理 |
输出参数 | 无,直接返回值 | 通过第二个参数输出 |
安全性 | 不推荐使用(已过时) | 推荐使用 |
使用示例
#include <stdio.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <string.h>
int main()
{char* addr1 = "192.168.1.110";char* addr2 = "192.168.2.266";printf("addr1 = %s\n", addr1);//inet_addr()##############################if(inet_addr(addr1) == INADDR_NONE){printf("error addr1\n");}elseprintf("inet_addr(addr1) = 0x%x\n",inet_addr(addr1));printf("addr2 = %s\n", addr2);if(inet_addr(addr2) == INADDR_NONE){printf("error addr2\n");}elseprintf("inet_addr(addr2) = 0x%x\n", (unsigned)inet_addr(addr2));//inet_aton()###############################struct sockaddr_in addr_struct;memset(&addr_struct, 0, sizeof(addr_struct));if(inet_aton(addr1, &addr_struct.sin_addr))printf("addr_struct.sin_addr.s_addr is 0x%x\n", addr_struct.sin_addr.s_addr); elseprintf("inet_aton is error!\n"); if(inet_aton(addr2, &addr_struct.sin_addr))printf("addr_struct.sin_addr.s_addr is 0x%x\n", addr_struct.sin_addr.s_addr); elseprintf("inet_aton is error!\n"); return 0;
}
sockaddr_in 结构体:
struct sockaddr_in
{sa_family_t sin_family; //地址族(ADDress Family)uint16_t sin_port; //16位TCP/UDP端口号struct in_addr sin_addr; //32位ip地址 char sin_zero[8]; //不使用,只是为了保证字节对齐
};struct in_addr
{in_addr_t s_addr; //32位IPV4地址
};
输出结果如下: