如何以TCP / IP网络字节顺序创建IP地址?

时间:2016-06-10 12:27:09

标签: c++ visual-studio-2010 boost boost-asio type-conversion

我使用原始boost套接字发送TCP数据包。 (在VS2010中编译) 我的问题是socket.send_to()的IP头的参数无效。

我检查了自己的IP头和TCP头结构对象,发现二进制文件大小错误。问题与源和目标的IP地址字段有关。

我正在输入IP地址:192.168.1.1,255.255.255.255,它运行正常。 但是,如果我提供IP地址10.10.7.1,则二进制结果是错误的。

所以让我们看一下struct,它将IP存储为unsigned int值:

#pragma pack(push, 1)
struct iphdrerer
  {
    uint32_t    saddr;
    uint32_t    daddr;
    uint32_t    baddr;
  };
#pragma pack(pop) 

IP需要将转换为二进制格式和大端。我选择了三个不同的IP示例:

iphdrerer foo;

foo.saddr = (uint32_t) htonl(  boost::asio::ip::address_v4::from_string("10.10.5.1").to_ulong() ) ;
foo.daddr = (uint32_t) htonl(  boost::asio::ip::address_v4::from_string("192.168.1.5").to_ulong()) ;
foo.baddr = (uint32_t) htonl(  boost::asio::ip::address_v4::from_string("255.255.255.255").to_ulong()) ;

std::cout << std::dec << foo.saddr << " HEX=> " << std::hex << foo.saddr << std::endl;
std::cout << std::dec << foo.daddr << " HEX=> " << std::hex << foo.daddr << std::endl;
std::cout << std::dec << foo.baddr << " HEX=> " << std::hex << foo.baddr << std::endl;

FILE* fout = fopen("foo.txt", "w");
fwrite(&foo, sizeof(iphdrerer), 1, fout);
fclose(fout);

控制台输出是:

17107466 HEX=> 1050a0a
83994816 HEX=> 501a8c0
4294967295 HEX=> ffffffff

我将struct对象导出为文件并在HEX查看器中打开它。 这是foo.txt:

的结果
  

0D 0A 0D 0A 05 01 C0 A8 01 05 FF FF FF FF

这些是14字节而不是12字节。我使用#pragma pack(push,1)删除了填充。

此外,文件的十六进制值与控制台输出不匹配。 输出应该显示TCP / IP的大端地址。

0 个答案:

没有答案