访问Windows上的in6_addr成员

时间:2014-02-19 05:11:12

标签: c windows

我有一个发送和接收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地址的字节? 我无法控制构建系统,我看到的唯一输出是编译的结果(如果构建成功,则是二进制文件的路径)。

1 个答案:

答案 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));
}