3

多数のサードパーティシステムに展開される組み込みアプリケーションがあり、通信する宛先アドレスごとに決定論的で静的な送信元IPアドレスが使用されていることを確認する必要があります(どの宛先IPアドレスと通信するかはわかっています)。

サードパーティは、(これらの制約に準拠しながら)適切と思われる方法でIPルーティングを自由に実装できる必要があります。決定論的で静的であり、理想的にはそれがどうなるかを確認する必要があります。

ただし、そのCアプリケーションはSolarisまたはLinuxのいずれかで実行できます。

これにはルーティングテーブルの問い合わせが必要になると思いますか?

何か案は?

4

3 に答える 3

3

私にとって(WindowsとLinuxの両方のマシンで)機能する方法は、 socket を作成し、このソケットで目的の宛先アドレスをSOCK_DGRAM呼び出すことです。connect()呼び出しが成功した場合は、呼び出しgetsockname()て、このソケット経由でデータを送信した場合に使用されるローカル アドレスを取得します。

このようなものです(作業コードに基づいており、簡潔にするためにエラーチェックが削除されています):

const char * destination_address = "8.8.8.8";
sockaddr_storage Addr = { 0 };
unsigned long addr = inet_addr( destination_address );
( ( struct sockaddr_in * ) &Addr)->sin_addr.s_addr = addr;
( ( struct sockaddr_in * ) &Addr)->sin_family = AF_INET;
( ( struct sockaddr_in * ) &Addr)->sin_port = htons( 9 ); //9 is discard port

int Handle = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
socklen_t AddrLen = sizeof(Addr);
connect( Handle, (sockaddr*)&Addr, AddrLen);
getsockname(Handle, (sockaddr*)&Addr, &AddrLen);
char* source_address = inet_ntoa(((struct sockaddr_in *)&Addr)->sin_addr);

printf( "source address: %s\n", source_address );

destination_address到達したいアドレスはどこにありsource_address、IP スタックが到達するために選択したアドレスが含まれている必要があります。

于 2015-04-07T20:36:46.697 に答える
1

私はあなたが正しかったことを願っています...

これらのサード パーティの管理者に、イーサネット ポートに追加の IP を追加するよう説得する必要があります (1 つしかないと仮定します)。C プログラムでは bind() を使用して、ソケットをこの IP アドレスにバインドできます。送信されたパケットには、送信元アドレスとしてバインドされた IP が含まれます。私はこれを Linux で使用していますが、Solaris でも同様に使用する必要があります。

于 2013-01-18T11:54:08.453 に答える
0

発信接続について話していると思います。

アプリbind()の IP アドレスは、使用中の送信元アドレスになります。そのため、どの IP アドレスが使用されるかは、完全にアプリケーションのコマンドの下にある可能性があります。

とにかく、アプリケーションは、 をbind()呼び出す前に明示的に ingしないことで、どの IP アドレスが使用されているかを気にしないことを選択できますconnect()


ルーティングによって送信元 IP アドレスが変更されることはありません。

一方、NAT (ネットワーク アドレス変換) は送信元の IP アドレスを変更します。

于 2013-01-18T12:44:39.587 に答える