我有一个发送和接收udp数据报的应用程序,仅适用于IPv4地址。它被集成到一个构建系统中,这样就可以使用相同的源为windows和linux构建二进制文件。我正在尝试增强它以使用IPv6。
我的更新源代码构建并适用于Linux但我在访问Windows上的in6_addr结构的成员时遇到问题。基于http://msdn.microsoft.com/en-us/library/windows/desktop/ms738560%28v=vs.85%29.aspx,我定义了以下宏:
#define IPV4_ADDR_ARGS(in6p) \
(in6p).u.Byte[12],(in6p).s6_addr.u.Byte[13], \
(in6p).s6_addr.u.Byte[14],(in6p).s6_addr.u.Byte[15]
并尝试将映射的IPv4地址的最后4个字节打印为:
struct sockaddr_in6 *in6 = (struct sockaddr_in6 *) ipAddr; // ipAddr is of type sockaddr_storage*
if (IN6_IS_ADDR_V4MAPPED(&in6->sin6_addr)) {
printf("ip:%u.%u.%u.%u", IPV4_ADDR_ARGS(in6->sin6_addr));
}
但是,编译器会抛出这样的错误:
server.c:错误C2224:“。u”左边必须有struct / union类型
是否有另一种方法可以从struct in6_addr访问IPv6地址的字节? 我无法控制构建系统,我看到的唯一输出是编译的结果(如果构建成功,则是二进制文件的路径)。
答案 0 :(得分:0)
我认为问题只是调用宏时的&符号(&
)。您的宏引用了in6_addr的实例,而不是指向它的指针。
更新。您的宏中也有拼写错误。它应该定义如下(没有s6_addr成员)
#define IPV4_ADDR_ARGS(in6p) (in6p).u.Byte[12], (in6p).u.Byte[13], (in6p).u.Byte[14], (in6p).u.Byte[15]
然后代替:
if (IN6_IS_ADDR_V4MAPPED(&in6->sin6_addr)) {
printf("ip:%u.%u.%u.%u", IPV4_ADDR_ARGS(in6->sin6_addr));
}
相反:
if (IN6_IS_ADDR_V4MAPPED(in6->sin6_addr)) {
printf("ip:%u.%u.%u.%u", IPV4_ADDR_ARGS(in6->sin6_addr));
}