inet_ntop()、inet_pton()、inet_addr()、inet_ntoa()函数之间的关系

- emmmmm,先看这张图来理解,知道这些函数的作用

inet_ntop()、inet_pton()、inet_addr()、inet_ntoa()函数之间的关系
1. inet_pton()源码
int inet_pton(int family, const char *strptr, void *addrptr)
{
    if (family == AF_INET) {
        struct in_addr  in_val;
        if (inet_aton(strptr, &in_val)) {
            memcpy(addrptr, &in_val, sizeof(in_val));
            return (1);
        }
    }
    errno = EAFNOSUPPOPT;
    return (-1);
}
1
2
3
4
5
6
7
8
9
10
11
12
2. inet_ntop()源码
const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len)
{
    const u_char *p = (const u_char*)addrptr;
    if (family == AF_INET) {
        char temp[INET_ADDRSTRLEN];
        snprintf(temp, sizeof(temp), "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
        if (strlen(temp) >= len) {
            errno = ENOSPC;
            rturn (NULL);
        }
        strcpy(strptr, temp);
        return (strptr);
    }
    errno = EAFNOSUPPOPT;
    return (NULL);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
3. inet_addr()
转换网络主机地址(点分十进制)为网络字节序二进制值,如果参数 char *cp 无效则返回-1(INADDR_NONE),但这个函数有个缺点:在处理地址为255.255.255.255时也返回-1,虽然它是一个有效地址,但inet_addr()无法处理这个地址。

in_addr_t inet_addr(const char *cp);
1
4. inet_ntoa()------->静态函数
inet_ntoa()函数转换网络字节序地址->标准的点分十进制地址。该函数返回值指向保存点分十进制的字符串地址的指针,该字符串的空间为静态分配 的,所以在第二次调用这个函数时,意味着上一次调用并保存的结果将会被覆盖(重写)。so creazy!!!

char *inet_ntoa(struct in_addr in);
1
好了那就来证实一下,inet_ntoa()的静态返回值吧!!

char *add1,add2;
src.sin_addr.s_addr  =  inet_addr("192.168.1.123");
add1 =inet_ntoa(src.sin_addr);                  
src.sin_addr.s_addr = inet_addr("192.168.1.124");
add2 = inet_ntoa(src.sin_addr);
 
printf("a1:%s\n",add1);
printf("a2:%s\n",add2);
1
2
3
4
5
6
7
8
最终的printf结果是:
a1:192.168.1.124
a2:192.168.1.124

- 这样来看的话,我认为如果有需要最好是用inet_pton()、inet_ntop()代替inet_ntoa()、inet_addr().

inet_pton(AF_INET, cp, &src.sin_addr);
代替
src.sin_addr.s_addr = inet_addr(cp);
1
2
3
4

char str[INET_ADDRATRLEN];
ptr = inet_ntop(AF_INET, &src.sin_addr, str, sizeof(str));
代替
ptr = inet_ntoa(src.sin_addr);
1
2
3
4
5

————————————————
版权声明:本文为****博主「lockin.」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.****.net/weixin_43858843/article/details/98960756