0

特定のインターフェイスのみをリッスンする TCP サーバーがあります。accept()着信接続がサブネットからのものである場合、呼び出し後xxx.xxx.xxx.0にデータが intf1 を通過する必要があり、それ以外の場合は、サーバーがリッスンしている intf2 を介してデータが送信される必要があります。

両方のインターフェイスのルート設定と優先度は同じです。両方のインターフェイスからすべてのネットワークにアクセスできます。

解決策の 1 つは、優先度の高い intf1 を介して新しいルートを追加することですが、これをコード ベースの決定にしたいと考えています。

コードは Linux で書かれたピュア C です。

4

3 に答える 3

1

探しているのは純粋なCオプションではありませんが、accept()の受信時にiptablesルールを使用できる可能性があります。

(/ lib / iptablesをざっと見てみると、運が良かったかもしれませんが)

すべてのtcpトラフィックを指定されたデバイスにリダイレクトするルールを想像しています。おそらく、ルールにソケットの状態を認識させて、accept()の後にインターフェースを指定する必要がないようにすることもできます。


これはすべて、スキームの明らかな欠陥を見つけて頭を叩き、「D'oh!」と言うまで当てはまります。

于 2008-09-23T11:29:36.783 に答える
0

残念ながら、TCP / IPスタックはカーネルに実装されており、インターフェイスはルーティングテーブルであるため、オプションは限られています。最善の策は、手動でルートを割り当てることです。

ネットリンクライブラリを使用してルートをオンザフライで追加/削除することもできますが、TCPパケットの一部は、呼び出しが行われるまで「間違った」インターフェイスを通過します。元のインターフェイスのアドレスを持つパケットが別のインターフェイスを介して送信されると、ルーティングの問題が発生する可能性があります。

于 2008-09-23T08:52:32.577 に答える
0

rtnetlinkを使用して、プログラムでルートを変更できます。必要なすべてのパラメーターを変更できます。netdeviceも参照してください。

于 2008-09-23T11:46:36.103 に答える