C中的虚线十进制到二进制

时间:2014-10-07 00:16:57

标签: c linux network-programming

我有一个in_addr结构,其中包含一个IP地址,我试图将点分十进制转换为二进制值。我真正需要做的事情,但无法完成工作,就像

destn = inet_addr(inet_ntoa(addr));

其中addrin_addr_t变量。我知道这违反了语法,但是当我更仔细地遵循语法时,我收到一个错误:

storage size of ‘addr’ isn’t known.

2 个答案:

答案 0 :(得分:2)

如果您已在struct in_addr变量中拥有IPv4地址,则无需执行任何操作:

/* Internet address. */
struct in_addr {
    uint32_t       s_addr;     /* address in network byte order */
};

ip(7)。只需访问s_addr字段,您就可以将IPv4地址放在一个简单的32位整数中。

示例程序:

#include <stdio.h>
#include <inttypes.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
    struct in_addr addr = {};
    const char *ip_str;

    if (argc < 2) {
        fprintf(stderr, "Usage: %s ip-addr\n", argv[0]);
        return 1;
    }
    ip_str = argv[1];

    if (!inet_aton(ip_str, &addr)) {
        fprintf(stderr, "Invalid IP address: %s\n", ip_str);
        return 1;
    }

    printf("Address: 0x%08"PRIX32"\n", addr.s_addr);
    // Just access the s_addr field --------^

    return 0;
}

使用示例:

$ gcc -Wall -Werror in.c 
$ ./a.out 192.168.7.4
Address: 0x0407A8C0
           ^ ^ ^ ^
           | | | \---- 192
           | | \------ 168
           | \-------- 7
           \---------- 4

答案 1 :(得分:1)

为了将来的兼容性,您应该同时处理IP 4和6.否则,您可能已经提到过inet_ntoa而不是inet_ntop。 (我的手机使用IP 6,所以如果我在手机上进行IP编程,我需要允许它。)那么,怎么样?以下是我的开始:

char *address_string;

(填写address_string的值。)

struct in_addr addr4;
int success4 = inet_pton(AF_INET, address_string, addr4);
struct in6_addr addr6;
int success6 = inet_pton(AF_INET6, address_string, addr6);

当然,您想要添加错误处理。

如果您正试图获取二进制IP号码的文本表示,那么这应该可以胜任:

struct in_addr addr4;
struct in6_addr addr6;
bool address_is_ip6;

(填写IP 4或6地址的值,并记下您正在使用的地址。)

socklen_t ip6_maximum_length = 40;
char address_string[ip6_maximum_length];
char *result = inet_ntop(address_is_ip6 ? AF_INET6 : AF_INET, address_is_ip6 ? &addr6 : &addr4, address_string, ip6_maximum_length);

同样,您需要处理错误。