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");
}
else
printf("inet_addr(addr1) = 0x%x\n",inet_addr(addr1));
printf("addr2 = %s\n", addr2);
if(inet_addr(addr2) == INADDR_NONE)
{
printf("error addr2\n");
}
else
printf("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);
else
printf("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);
else
printf("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地址
};
输出结果如下: