5

別のアプリケーションがリッスンしているポートをリッスンできるように、C++ でクライアント UDP ソケットを作成するにはどうすればよいですか? つまり、C++ でポート多重化を適用するにはどうすればよいでしょうか?

4

3 に答える 3

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して元の宛先アドレスを取得します。

ややこしく聞こえるかもしれませんが... ええ、それは少しややこしいからです :-) 私の仮定が異なる場合は、ファイアウォールのドキュメントを参照してください。

于 2010-10-07T05:23:23.450 に答える
2

tcpdumpこれは、またはのような単なるパケット スニッフィングsnoopであり、未加工のソケットを開き、必要に応じてワイヤーとフィルターからすべてを引き出します。おそらくlibpcapを使用して、作業を少し簡単にしたいと思うでしょう。

管理者権限またはスーパーユーザー権限がない場合は、ターゲット アプリケーションがプラットフォームに応じてSO_REUSEADDRポートを開く必要があります。SO_REUSEPORTブロードキャスト パケットとマルチキャスト パケットしか受信できないことに注意してください。ユニキャスト パケットは、最初に開いているソケットに配信されます。

于 2010-10-07T04:14:24.667 に答える
1

これは多重化ではありません。この用語は、同じプロセス内の複数のチャネルでI / Oを処理するために予約されており、のようなものselect(2)poll(2)最も役立ちます。

あなたが求めているのはマルチキャストです。これが基本的な例です

IPは、マルチキャスト用に特別な範囲のアドレス(別名グループ)を予約していることに注意してください。これらは特別なイーサネットアドレスにマッピングされます。リスナーはマルチキャストグループに参加する必要がありますが、送信者は参加する必要はありませんが、通常どおりに送信します。

お役に立てれば。

于 2010-10-07T03:35:55.363 に答える