私が行っているこのプロジェクトについて、私はすでにここ (リンク) で質問を開始していますが、これには多くの問題があり続けています。
私の以前の質問では、同じマシンから 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 を送信しています。
さて、実際の質問:
私は今、私のマルチキャスト、いわゆる知識を疑っています。私の Mac が ipmidi のデータグラムをマルチキャストしている場合、それはデータグラムが私の Mac のすべての可能な場所を介して送信されていることを意味しますよね? つまり、ip 225.0.0.37 は、wifi とイーサネットを介したマルチキャストを意味しますか、それとも、選択したネットワーク インターフェイスにルーティングする必要がありますか?
私のraspiはイーサネット経由でデータグラムを受信しているとされているので、プログラムにipmidiのデータグラム宛先ポートでリッスンさせるだけで十分ですか、それともデータグラムがどこから来たのかを明示的に伝える必要がありますか?
C/C++ の API のように、マルチキャスト受信アプリを作成する簡単な方法はありますか? リンクしたコードでわかるように、私は現在 C スタイルのソケットを使用していますが、これは私が実行しているプログラムの主な目的ではなく、ネットワークに集中するのではなく、ネットワークについて学ぶことに多くの時間を費やしていることに気づきました。実物。
長い質問で申し訳ありませんが、多くの疑問があり、文脈を理解したかったのです。
助けてくれてありがとう!