0

我正在尝试使用 boost::asio 库在网络上发送原始 TCP 数据包。我的程序在 Mac OS X 10.8 上运行良好,但是当我在 Windows 7 下运行程序时出现异常(在控制台中):Error: send_to: An invallid argument was supplied.打开套接字的代码和send_to()方法是:

try {
    socket_.open();
    socket_.send_to(request_buffer.data(), ep);
} catch (std::exception& e) {
    std::cerr << "Error: " << e.what() << std::endl;
}

用于定义端点:

    ip::address_v4::bytes_type b = {{XXX, XXX, XXX, XXX}};
ip::raw::endpoint ep(boost::asio::ip::address_v4(b), (portnumber);

如何解决异常,使程序可以在 Windows 下运行?在 Visual Studio 2010 的输出窗口中,例外情况是:

First-chance exception at 0x000007fefcce9e5d (KernelBase.dll) in (programname).exe: Microsoft C++ exception: boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> > at memory location 0x0,...
4

1 回答 1

1

似乎 RAW TCP 套接字在 Windows 7 中被阻止(http://msdn.microsoft.com/nl-nl/library/windows/desktop/ms740548(v=vs.85).aspx)。使用此链接 ( http://www.savarese.com/software/rocksaw/#Q4 ) 故事已经得到证实,为了通过 Windows 上的原始套接字写入 TCP 数据包:您必须使用 IPPROTO_IP 或IPPROTO_RAW。然后您必须设置 IP_HDRINCL 套接字选项并填充每个数据包的 IP 和 TCP 标头。就 RockSaw 而言,这意味着在 Windows 上,您必须使用 RawSocket.getProtocolByName("ip") 和 setIPHeaderInclude(true)。

因此,使用 Boost::Asio 似乎不可能发送带有自己的 IP 标头和自定义 TCP 数据包的数据包(请参阅 Kevin Conley 的 github,上面在评论中命名)

于 2013-06-18T10:43:15.923 回答