IP地址转换-C语言
#include <arpa/inet.h>
int inet_aton(const char *cp, struct in_addr *inp);
in_addr_t inet_addr(const char *cp);
inet_aton
函数将点分十进制的IP地址(如192.168.1.10)转换为二进制数值,并存储在struct in_addr
结构中(通过参数inp
传入)。函数返回非零值表示转换成功,返回0表示转换失败或无效的主机地址。inet_addr
函数将点分十进制的IP地址转换为网络字节序的二进制值。如果参数cp
无效,函数返回-1(INADDR_NONE
)。需要注意的是,该函数在处理地址为255.255.255.255时也会返回-1,但255.255.255.255实际上是一个有效的地址,只是inet_addr
无法处理而已。
#include <arpa/inet.h>
char *inet_ntoa(struct in_addr in);
inet_ntoa
函数将网络字节序的地址转换为标准的ASCII格式的点分十进制IP地址。函数返回指向转换后的字符串地址的指针。需要注意的是,该函数内部使用静态分配的空间存储转换结果,因此在第二次调用该函数时,上一次调用的结果会被覆盖。如果需要保存转换结果,应复制该字符串并自行管理。
以下是一个示例程序,演示如何使用这些函数:
#include <stdio.h>
#include <arpa/inet.h>
int main()
{
struct in_addr addr1, addr2;
in_addr_t l1, l2;
l1 = inet_addr("192.168.0.74");
l2 = inet_addr("211.100.21.179");
memcpy(&addr1, &l1, 4);
memcpy(&addr2, &l2, 4);
printf("%s : %s\n", inet_ntoa(addr1), inet_ntoa(addr2));
printf("%s\n", inet_ntoa(addr1));
printf("%s\n", inet_ntoa(addr2));
return 0;
}
实际运行结果如下:
yamlCopy code192.168.0.74 : 192.168.0.74
192.168.0.74
211.100.21.179
在上面的示例中,可以看到printf
函数中的inet_ntoa
只被调用了一次。这是因为inet_ntoa
返回的是一个指向静态分配空间的指针,后续调用会覆盖前一次的结果。
#include <arpa/inet.h>
int inet_pton(int family, const char *strptr, void *addrptr);
const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
inet_pton
函数将点分十进制的IP地址转换为网络传输所需的数值格式。family
参数可以是AF_INET
(IPv4)或AF_INET6
(IPv6)。函数返回1表示转换成功,返回0表示输入不是有效的表达式格式,返回-1表示出错。inet_ntop
函数与inet_pton
相反,将数值格式的地址转换为点分十进制的IP地址格式。strptr
参数指定目标存储单元的地址,len
参数指定目标存储单元的大小。函数返回转换后的地址字符串的指针。如果转换失败或目标存储单元太小而无法容纳结果,函数返回空指针。
需要注意的是,如果使用不支持的地址族作为family
参数,这两个函数都会返回错误,并将errno
置为EAFNOSUPPORT
。
#include <arpa/inet.h>
struct sockaddr_in foo;
inet_pton(AF_INET, ip, &foo.sin_addr); // 替代 foo.sin_addr.s_addr = inet_addr(ip);
char str[INET_ADDRSTRLEN];
char *ptr = inet_ntop(AF_INET, &foo.sin_addr, str, sizeof(str)); // 替代 ptr = inet_ntoa(foo.sin_addr);
以上是关于IP地址转换和相关函数的详细说明。如果需要更多信息,可以参考以下链接:
推荐一个零声学院免费教程,个人觉得老师讲得不错,分享给大家,有兴趣可以去看看:[Linux,Nginx,DPDK等技术内容,点击立即学习.