我使用原始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的大端地址。