0

私が行っているこのプロジェクトについて、私はすでにここ (リンク) で質問を開始していますが、これには多くの問題があり続けています。

私の以前の質問では、同じマシンから udp マルチキャストを読みたかったのですが、その方法を見つけましたが、ipmidi ではできませんでした。 UDP マルチキャストを介して MIDI イベントを送信できます)。

私はwiresharkで作業しており、ipmidiがデータグラムをip 225.0.0.37、ポート21928に送信していることを確認できました。これは、実際にはマルチキャストであることがわかります。次に、このコード (リスナー) を使用して、ipmidi によって送信されたデータグラムをエコーし​​ようとしましたが、成功しませんでした (マルチキャスト IP とポートを変更しました)。この後、このコードをラズベリー pi から実行してみることにしました。テスト目的で自分の Mac で実行することだけが目的だったので、実物に行きました。

私のraspiでコードを再度コンパイルすると、gccはsetsockopt()無効な引数があると主張しました。perror()問題がここにあることを私に伝えるのに十分役に立ちました:

setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq))

そこで、カーネルにマルチキャスト アドレスを要求する部分を削除し、ポート 21928 で単純なリッスン ソケットにしましたが、それでも機能しません。Mac からイーサネット経由で raspi に midi を送信しています。

さて、実際の質問:

  1. 私は今、私のマルチキャスト、いわゆる知識を疑っています。私の Mac が ipmidi のデータグラムをマルチキャストしている場合、それはデータグラムが私の Mac のすべての可能な場所を介して送信されていることを意味しますよね? つまり、ip 225.0.0.37 は、wifi とイーサネットを介したマルチキャストを意味しますか、それとも、選択したネットワーク インターフェイスにルーティングする必要がありますか?

  2. 私のraspiはイーサネット経由でデータグラムを受信して​​いるとされているので、プログラムにipmidiのデータグラム宛先ポートでリッスンさせるだけで十分ですか、それともデータグラムがどこから来たのかを明示的に伝える必要がありますか?

  3. C/C++ の API のように、マルチキャスト受信アプリを作成する簡単な方法はありますか? リンクしたコードでわかるように、私は現在 C スタイルのソケットを使用していますが、これは私が実行しているプログラムの主な目的ではなく、ネットワークに集中するのではなく、ネットワークについて学ぶことに多くの時間を費やしていることに気づきました。実物。

長い質問で申し訳ありませんが、多くの疑問があり、文脈を理解したかったのです。

助けてくれてありがとう!

4

2 に答える 2

2

ポートをリッスンするだけでは十分ではありません。マルチキャスト グループに送信されたデータグラムを見たい場合は、マルチキャスト グループに参加する必要があります。

呼び出しからの「無効な引数」エラーは、setsockopt()おそらくmreq引数が悪かったことを意味します。指定したマルチキャスト アドレスについては、次のことを行う必要があります。

struct ip_mreqn mreq;

inet_aton("225.0.0.37", &mreq.imr_multiaddr);
mreq.imr_address.s_addr = htonl(INADDR_ANY);
mreq.imr_ifindex = 0;
于 2013-05-28T21:36:26.190 に答える