ZBLOG

inet_ntop()

inet_ntop()函数可以将一个以网络字节序表示的IP地址转换为点分十进制的IP地址。与inet_ntoa()函数不同,inet_ntop()支持IPv4和IPv6地址转换,并且可以自定义输出格式,避免了静态缓冲区覆盖的问题。

在Windows下,可以使用以下方式调用inet_ntop()函数:

#include <Ws2tcpip.h>

// af:指定要转换的协议族(AF_INET或AF_INET6)
// src:指向以网络字节序表示的IP地址的指针
// dst:指向存储结果字符串的缓冲区的指针
// size:dst缓冲区大小
// 返回值:指向结果字符串的指针,如果出错则返回NULL
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

其中,参数说明如下:

  • af:指定要转换的协议族,可选值有AF_INET(IPv4)和AF_INET6(IPv6)
  • src:指向以网络字节序表示的IP地址的指针。
  • dst:指向存储结果字符串的缓冲区的指针。
  • size:缓冲区大小。

需要注意以下几点:

  • 如果返回值为NULL,则说明转换失败。
  • 缓冲区大小应该足够大,否则可能会截断部分结果。
  • IPv4地址对应输出格式为“x.x.x.x”,IPv6地址对应输出格式为“xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx”(其中每组x表示4位16进制数)。

下面是一个使用inet_ntop()函数将IP地址转换为字符串的示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <Winsock2.h>
#pragma comment(lib, "ws2_32.lib")

int main() {
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        printf("WSAStartup failed.\n");
        return -1;
    }

    char ip[INET6_ADDRSTRLEN];
    struct in_addr ipv4Addr = {0};
    struct in6_addr ipv6Addr = {0};

    // 将IPv4地址转换为字符串
    inet_pton(AF_INET, "192.168.0.1", &ipv4Addr);
    const char *strIPv4 = inet_ntop(AF_INET, &ipv4Addr, ip, INET_ADDRSTRLEN);
    if (strIPv4 == NULL) {
        printf("Failed to convert IPv4 address.\n");
        return -1;
    }
    printf("%s\n", strIPv4);

    // 将IPv6地址转换为字符串
    inet_pton(AF_INET6, "2001:db8::1", &ipv6Addr);
    const char *strIPv6 = inet_ntop(AF_INET6, &ipv6Addr, ip, INET6_ADDRSTRLEN);
    if (strIPv6 == NULL) {
        printf("Failed to convert IPv6 address.\n");
        return -1;
    }
    printf("%s\n", strIPv6);

     WSACleanup();
    return 0;
}

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=999

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?