質問

C ++でクライアントUDPソケットを作成して、別のアプリケーションで聴いているポートで聞くことができるようにするにはどうすればよいですか?言い換えれば、C ++でポートマルチプレックスを適用するにはどうすればよいですか?

役に立ちましたか?

解決

1つのポートだけで聞きたいです

スニファーでそれを行うことができます。異なるポートからのパケットを無視するだけです。

私のプログラムは元のアプリケーションの代わりにそれを送信するので、私はそれがいくつかの特定のパケットを送信するのを止める必要があるかもしれません

さて、ここで私はあなたにスニファーを捨てて、 MITM 技術。

事前に出て行くファイアウォールルールに頼る必要があります 迂回します "へのパケットプロキシー「アプリケーション。UDP、Linux、Iptables、およびTheを仮定する」プロキシー「同じホストで走っている、これが何だ」プロキシー「実際に行う必要があります:

1. ファイアウォールルールを追加します 迂回します パケット(必要に応じて手動で行う):

iptables -t nat -A PREROUTING -i <iface> -p <proto> --dport <dport>
    -j REDIRECT --to-port <newport>

2. バインドして聞いてください <newport>.

3. 2つのエンドポイント(クライアント、および元の宛先)間のすべてのトラフィックを中継します。あなたが実行している場合プロキシー「別のホストで使用してください GetSockoptSO_ORIGINAL_DST 元の宛先アドレスを取得します。

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

他のヒント

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

管理者またはスーパーユーザーの特権がなければ、ポートを開くにはターゲットアプリケーションが必要です SO_REUSEADDRSO_REUSEPORT プラットフォームに適しています。警告は、ブロードキャストとマルチキャストパケットのみを受信できることです。ユニキャストパケットは最初のオープンソケットに配信されます。

これは いいえ 多重化 - その用語は、同じプロセスで複数のチャネルでI/Oを処理するために予約されています。 select(2)poll(2) 最も便利です。

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

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

お役に立てれば。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top