2009-05-05 8 views
3

ある物理インタフェースから別の物理インタフェースにソケットを再バインドするための既存のLinux/POSIX C/C++ライブラリまたはサンプルコードがありますか?ソケットを別のインタフェースに再バインドする

たとえば、物理接続Aに関連付けられたソケットでpingを送信し、そのソケットを物理接続Bに再バインドして、接続Bでpingパケットの送受信を継続したい(短いスイッチオーバ中の遅延)。

これは、セッションレスプロトコルにのみ必要です。

はありがとう

アップデート:私はPPPとイーサネットデバイスで使用するためのフェイルオーバーソリューションを提供しようとしています

私は、iptables、NAT、ルーティングテーブルを使用して機能の90%を達成できる基本的なスクリプトを用意しています。

フェールオーバーが発生しても、セカンダリ接続でpingが送信され続けますが、ソースIPは古い接続からのものです。

私は、商用ルータで作業する数人の人と話しましたが、その提案はセカンダリインターフェイスへのソケットの再バインドです。

更新2:

これを先に指定しないとお詫び申し上げます。このソリューションはルータ上で動作します。クライアントコンピュータ上で実行されるため、pingプログラムを変更することはできません。私は単なる例としてpingを使用しました。セッションベースでない接続は、切り替えが可能でなければなりません。私はいくつかの商用ルータでこの機能をテストしましたが、動作します。残念ながら、そのソフトウェアは独自のものですが、さまざまな会話やテストから、フェールオーバー時にソケットを再バインドしていることがわかりました。

+1

私はおそらくここで何かが不足していますが、ソケットを閉じてもう一方のインターフェイスにバインドしてみましたか? – Duck

+0

Thanks Duck、 私はそれを試して何が起こるか見るつもりです。 –

答えて

3

更新されたポストでは、ルーティング情報を変更するとpingの送信元アドレスが変更されず、2番目のインターフェイスから強制的に削除されるという問題があります。 This answerに関連情報が含まれています。

pingプログラムを変更する必要があります。インターフェイスごとのソケットアプローチを使用して、何らかの形でプログラムにフェールオーバーを通知できます。または、ソケットを閉じてから2番目のインターフェイスにバインドする必要があります。

SIOCGIFCONFオプションを指定してioctl()を呼び出し、返された構造をループしてインターフェイスアドレス情報を取得するなど、インターフェイス情報をいくつか取得する必要があります。

+0

私はprocパラメータ/ proc/sys/net/ipv4/netfilter/ip_conntrack_icmp_timeoutを1に設定してicmpパケットを強制的にタイムアウトさせ、元の値にリセットしました。これにより、異なるインタフェースにpingが強制的に再バインドされます。これは厄介ですが、そのNICのRalinkドライバはioctl呼び出しをかなりサポートしていません。 –

0

私はそれはかなり明確な操作だとは思わない。物理インターフェイスには異なるMACアドレスが割り当てられています。ルーティングレイヤをマッピングしない限り(NATなど)、異なるIPアドレスを使用します。

ポートは、<IP addr, Port number, protocol>のトリプルで識別されます。したがって、IPアドレスが変更された場合、ポートは変更されます。

あなたは本当にここで何をしようとしていますか?

0

私はあなたが達成しようとしていることはまったく確信していませんが、私は推測しています...何らかのフェールオーバーをしようとしていますか?もしそうなら、実際にそれを達成する方法はありますが、アプリケーションではなくOSでそれを行うのはなぜですか?

片端ではCARPを使用できますが、フェールオーバーモードではインターフェイスのトランキング/ボンディング(用語が異なる)を使用できます。

+0

CARPとボンディングを見ましたが、CARPとLinux 2.6のスペースの制約のために使用できません。カーネルには、残念なことにイーサネットとPPPデバイスのボンディングがありません。 –

関連する問題