6

多くの人が抱えている問題のようですが、これまでに見つけたすべての答えは役に立ちませんでした。

問題: UDP 経由で PC にパケットを送信する Velodyne HDL32 をリッスンしようとしています。OS は 32 ビットの Ubuntu と Boost ライブラリ v1.46 です。

Wireshark 経由で取得したデータは次のようになります。

Time     | Source         | Destination   | Protocol | Length | Source Port | Destination Port
0.000000 | 192.168.17.212 | 192.168.3.255 | UDP      | 1248   | https       | opentable

しかし、このコードでは、データは表示されません (ポートは正しいです):

receiver(boost::asio::io_service& io_service,
  const boost::asio::ip::address& listen_address)
: m_socket(io_service)
{

boost::asio::ip::address ipAddr = boost::asio::ip::address_v4::any();
boost::asio::ip::udp::endpoint listen_endpoint(
         ipAddr, 2368);

m_socket.open(listen_endpoint.protocol());
m_socket.bind(listen_endpoint);

m_socket.async_receive_from(
    boost::asio::buffer(m_data, max_length), m_sender_endpoint,
    boost::bind(&receiver::handle_receive_from, this,
      boost::asio::placeholders::error,
      boost::asio::placeholders::bytes_transferred));
}

void handle_receive_from(const boost::system::error_code& error,
  size_t bytes_recvd)
{
std::cout << "receive" << bytes_recvd << std::endl;


  m_socket.async_receive_from(
      boost::asio::buffer(m_data, max_length), m_sender_endpoint,
      boost::bind(&receiver::handle_receive_from, this,
        boost::asio::placeholders::error,
        boost::asio::placeholders::bytes_transferred));
}

これまでに誰かが問題を特定できますか、それとももっと情報が必要ですか? 私が得ることができる助けに感謝します。

注: root 権限でプログラムを実行しているわけではありません!

いくつかの考え: boost::asio::ip::address_v4::any() が IP をリッスンしない可能性があります.*.255 サブネットマスクが 255.255.255.0 の場合?

netcat を使用すると、データも表示されません。Windows netcat を使用すると、問題なく動作します。Linux および Windows の Wireshark と同じ - 正常に動作します。も試してみましたが、同じ効果がありました - データはありません。

4

2 に答える 2

2

私を助けてくれてありがとう。コードは問題ありませんでしたが、ベロダインとネットワーク設定に問題がありました。

ベロダインを使用しようとする他のすべての人への説明:

velodyne には独自のサブネットワーク (192.168.17.x) があります。記録されたすべてのデータは、ブロードキャストによってサブネットワーク 192.168.3.x に送信されます。通常の状況では、データはこのサブネット内のすべての IP で受信されるはずですが、これは不可能のようです。データを受信できる唯一の IP は IP 255 であり、これら 2 つのソリューションのいずれかを使用する場合に限ります。(または、windows を使用するか、wireshark でファイルをダンプします)

1. ばかげているが有効な解決策

ゲートウェイを 192.168.3.1 に設定します。はい、ありませんが、問題ではありません。これからは、IP 255 でデータを受信します。

2. クリーンなソリューション

すべてのトラフィックを velodyne のサブネットからサブネット 192.168.3.x に導く新しいルートを設定します。

なぜそんなに複雑なのかはよくわかりませんが、この「秘密」を発見するのにかなりの時間がかかりました. うまくいけば、あなたの何人かは私たちの気難しい仕事から利益を得るでしょう.

于 2012-06-11T13:50:01.153 に答える
0

ブロードキャストオプションを設定してみましたか?

// do this before binding
boost::asio::socket_base::broadcast option(true);
m_socket.set_option(option);
于 2012-05-26T20:17:42.433 に答える