send_to:提供了无效参数

时间:2013-06-17 12:48:52

标签: c++ windows visual-studio-2010 tcp boost-asio

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

send_to()

用于定义端点:

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

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

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

1 个答案:

答案 0 :(得分:1)

似乎在Windows 7(http://msdn.microsoft.com/nl-nl/library/windows/desktop/ms740548(v=vs.85).aspx)中阻止了RAW TCP套接字。使用此链接(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,在评论中命名)