我有一个in_addr
结构,其中包含一个IP地址,我试图将点分十进制转换为二进制值。我真正需要做的事情,但无法完成工作,就像
destn = inet_addr(inet_ntoa(addr));
其中addr
是in_addr_t
变量。我知道这违反了语法,但是当我更仔细地遵循语法时,我收到一个错误:
storage size of ‘addr’ isn’t known.
答案 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);
同样,您需要处理错误。