IP地址转换-C语言

IP地址转换-C语言

  1. 把IP地址转化为用于网络传输的二进制数值

    在C/C++中,可以使用以下函数将IP地址转换为二进制数值并存储在相应的数据结构中:

#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无法处理而已。
  1. 将网络传输的二进制数值转化为成点分十进制的IP地址

    在C/C++中,可以使用以下函数将网络传输的二进制数值转换为点分十进制的IP地址:

#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返回的是一个指向静态分配空间的指针,后续调用会覆盖前一次的结果。

  1. 新型网络地址转化函数inet_pton和inet_ntop

    随着IPv6的出现,引入了新的函数用于地址转换,适用于IPv4和IPv6地址。这两个函数分别是:

#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

  1. 示例

    使用inet_ptoninet_ntop函数的示例代码如下:

#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地址转换和相关函数的详细说明。如果需要更多信息,可以参考以下链接:

  1. inet_pton()和inet_ntop()函数详解 [1]
  2. IP地址转换(C++) [2]
  3. 网络字节序的二进制地址与文本字符串格式相互转换 [3]

推荐一个零声学院免费教程,个人觉得老师讲得不错,分享给大家,有兴趣可以去看看:[Linux,Nginx,DPDK等技术内容,点击立即学习.

Guess you like

Origin blog.csdn.net/weixin_36184908/article/details/131117287