【问题标题】:Mac/Windows different formats for in_addr structure (IPv4 address)Mac/Windows 不同格式的 in_addr 结构(IPv4 地址)
【发布时间】:2012-09-07 13:02:32
【问题描述】:

我正在将一些 Windows 代码移植到 Mac。我遇到了一些使用 in_addr 类型的代码,并在此处找到了 Windows 实现的文档:http://msdn.microsoft.com/en-us/library/windows/desktop/ms738571%28v=vs.85%29.aspx

我遇到的具体问题是代码试图访问 in_addr 的 S_un 属性,编译器 (CLang) 抱怨该属性不存在。查看 Mac 实现的定义,我得到了这个(usr/include/netinet/in.h):

struct in_addr {
    in_addr_t s_addr;
};

...和in_addr_t定义如下(在usr/include/sys/types.h中):

typedef __uint32_t      in_addr_t;

是否有人知道解决此问题的好方法,或者 Mac 上是否存在与 Windows 实现更紧密相关的 IPv4 地址表示?

【问题讨论】:

  • 代码访问的究竟是什么?因为S_un 只是一个联合。如果它正在访问S_un.S_addr,则与仅访问s_addr 相同。否则您需要自己提取数据。

标签: c++ windows macos ip-address


【解决方案1】:

看我的评论。而且...您可以在代码中实现 windows 声明(只是不要将其称为 in_addr 以避免冲突)。你可以这样做:

 typedef struct Win_in_addr {
   union {
     struct {
       __uint8_t s_b1,s_b2,s_b3,s_b4;
     } S_un_b;
     struct {
       __uint16_t s_w1,s_w2;
     } S_un_w;
     __uint32_t S_addr;
   } S_un;
 } Win_IN_ADDR, *Win_PIN_ADDR, *Win_LPIN_ADDR;

但请注意,这是不可移植的,只能在小端 CPU 上按预期工作。

【讨论】:

  • 谢谢 - 是的,我想我可能需要这样做。也感谢关于字节序的说明,绝对值得牢记这一点。
  • 只是为了澄清和解决我的好奇心,您是否建议仅在@benwad 的代码需要访问S_addr 以外的任何内容时才使用此结构?否则我会认为#define S_un.S_addr S_addr 会成功。关于关于可移植性/小端的评论,是因为您假设应用程序可能正在尝试访问各种成员,例如最初编程 S_addr 然后读取 s_b1?从我一直在做的阅读中,我得到S_addr 是或应该是唯一使用的成员的印象。