別のアプリケーションがリッスンしているポートをリッスンできるように、C++ でクライアント UDP ソケットを作成するにはどうすればよいですか? つまり、C++ でポート多重化を適用するにはどうすればよいでしょうか?
3 に答える
1 つのポートだけでリッスンしたい
スニファーでそれを行うことができます。異なるポートからのパケットは無視してください。
私のプログラムは元のアプリケーションの代わりにそれを送信するため、特定のパケットの送信を停止する必要があるかもしれません
わかりました、ここでは、スニファーを破棄して、MITM手法を使用することをお勧めします。
パケットを「プロキシ」アプリケーションに転送するには、 PREROUTINGファイアウォール ルールに依存する必要があります。UDP、Linux、iptables、および「プロキシ」が同じホストで実行されていると仮定すると、「プロキシ」が実際に行う必要があるのは次のとおりです。
1.ファイアウォール ルールを追加して、パケットを迂回させます (必要に応じて手動で行います)。
iptables -t nat -A PREROUTING -i <iface> -p <proto> --dport <dport>
-j REDIRECT --to-port <newport>
2.バインドして聞く<newport>
。
3. 2 つのエンドポイント (クライアントと元の宛先) 間のすべてのトラフィックをリレーします。別のホストで「プロキシ」を実行している場合は、 getsockoptを使用SO_ORIGINAL_DST
して元の宛先アドレスを取得します。
ややこしく聞こえるかもしれませんが... ええ、それは少しややこしいからです :-) 私の仮定が異なる場合は、ファイアウォールのドキュメントを参照してください。
tcpdump
これは、またはのような単なるパケット スニッフィングsnoop
であり、未加工のソケットを開き、必要に応じてワイヤーとフィルターからすべてを引き出します。おそらくlibpcapを使用して、作業を少し簡単にしたいと思うでしょう。
管理者権限またはスーパーユーザー権限がない場合は、ターゲット アプリケーションがプラットフォームに応じてSO_REUSEADDR
ポートを開く必要があります。SO_REUSEPORT
ブロードキャスト パケットとマルチキャスト パケットしか受信できないことに注意してください。ユニキャスト パケットは、最初に開いているソケットに配信されます。
これは多重化ではありません。この用語は、同じプロセス内の複数のチャネルでI / Oを処理するために予約されており、のようなものselect(2)
がpoll(2)
最も役立ちます。
あなたが求めているのはマルチキャストです。これが基本的な例です。
IPは、マルチキャスト用に特別な範囲のアドレス(別名グループ)を予約していることに注意してください。これらは特別なイーサネットアドレスにマッピングされます。リスナーはマルチキャストグループに参加する必要がありますが、送信者は参加する必要はありませんが、通常どおりに送信します。
お役に立てれば。