你能解释一下这个ip_to_string函数是如何工作的吗?

时间:2010-05-05 15:49:24

标签: c ip

#define IPTOSBUFFERS    12
char *iptos(u_long in)
{
    static char output[IPTOSBUFFERS][3*4+3+1];
    static short which;
    u_char *p;

    p = (u_char *)∈
    which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
    _snprintf_s(output[which], sizeof(output[which]), sizeof(output[which]),"%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
    return output[which];
}

有什么我不理解的吗?

2 个答案:

答案 0 :(得分:2)

下面注明您的喜好:

// This is the number of IP string buffers.
#define IPTOSBUFFERS 12

char *iptos(u_long in)
{
    // 12 buffers, each big enough to hold maximum-sized IP address
    //   and nul terminator.
    static char output[IPTOSBUFFERS][3*4+3+1];

    // Last buffer used.
    static short which;

    // Get uns. char pointer to IP address.
    u_char *p;
    p = (u_char *)∈

    // Move to next string buffer, wrapping if necessary.
    which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);

    // Output IP address by accessing individual unsigned chars in it.
    _snprintf_s(output[which], sizeof(output[which]), sizeof(output[which]),
        "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);

    // Return the current buffer.
    return output[which];
}

这是有效的,因为IPv4地址的表示在内存中是32位值,并且四个段中的每一个每个占用一个八位字节。因此,将32位整数的地址转换为四字符数组然后使用该数组来提取各个段是相对简单的事情。当然,这取决于具有特定位宽的数据类型,因此它不具备可移植性。

奇怪的是12-IP-Address循环队列。也许那样你一次最多可以获得12个IP地址,而不会被字符串覆盖,尽管我认为我从未遇到过两个以上(代理服务器或pass-thru服务器可能有三个)的情况。同时需要。我不认为这是为了线程安全,因为对which的修改在线程环境中本质上是危险的。

答案 1 :(得分:1)

这是一个答案,基于评论中似乎令人困惑的内容。

IP地址通常在内部表示为32位。它通常表示为4个十进制字段,范围从0到255.要从十进制表示转换为32位表示,只需将字段从十进制转换为二进制(或十六进制),从左到右,并连接它们。

因此,1.2.3.4成为字段0x01,0x02,0x03和0x04。因此,它们的32位(无符号长)表示为:0x01020304。当然,这也受字节排序的影响......

要将32位地址作为字符串打印,只需查看组成它的四组8位中的每一组,并将它们打印为十进制整数,并在其间用点组成。