0

boost::asio ライブラリを使用して、Raw 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

Windows 7 で RAW TCP ソケットがブロックされているようです ( http://msdn.microsoft.com/nl-nl/library/windows/desktop/ms740548(v=vs.85).aspx )。このリンク ( http://www.savarese.com/software/rocksaw/#Q4 ) を使用すると、ストーリーが確認され、Windows で raw ソケットを介して TCP パケットを書き込むには、IPPROTO_IP または 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 に答える