1

TCP 接続を確立する前に、そのローカル IP アドレスを取得する必要があります (INVITE メッセージでの SIP の Contact に相当)。最初のメッセージには自分の IP アドレスが含まれている必要があり、使用されるライブラリは接続を開く前に完全なメッセージを必要とします。

サーバーに 10.0.13.115 があり、クライアントに次の IP アドレスがあるとします。

  • 10.0.14.33 - VPN、このアドレスが使用されます
  • 172.16.5.99 - ローカル ネットワーク
  • 192.168.75.66 - virtualbox、virtualPC、VMWare などのブリッジ。

ローカル インターフェイスを使用するためだけにサーバーへの (ダミーの) 接続を開く以外に、10.0.14.33 を取得する (簡単な) 方法はありますか?

編集:これまでの回答ありがとうございます。サーバーもプロトコルも変更できないので、クライアント側のアドレスが本当に必要です。ネットワークライブラリを変更できるかどうかを確認します。

OS /ネットワークスタックも情報を把握する必要があるため、可能性があることを望んでいました...

4

3 に答える 3

2

The easiest, bar going through hoops of querying the local routing table and interfaces is:

connect() an UDP socket to the destination, and learn the local address with getsockname(). Since it's an UDP socket, nothing is actually sent anywhere.

If the message you're sending is over the same TCP connection you establish, this is not needed though, as you naturally can just establish the TCP connection, get the local address with getsockname(), use that address in the first "message" you send over that connection.

于 2013-06-07T09:58:59.873 に答える
0

UDP ソケット (TCP の場合もあります) 経由で接続するだけで、次の経由でアドレスを読み取ります

int getsockname(int sockfd, struct sockaddr *addrsocklen_t *" addrlen );

そしてこれを使います。

Linuxのマニュアルページから:

getsockname() は、ソケット sockfd がバインドされている現在のアドレスを、addr が指すバッファーに返します。addrlen 引数は、addr が指すスペースの量 (バイト単位) を示すように初期化する必要があります。返されると、ソケット アドレスの実際のサイズが含まれます。提供されたバッファーが小さすぎる場合、返されるアドレスは切り捨てられます。この場合、addrlen は、呼び出しに提供された値よりも大きい値を返します。

戻り値

成功すると、ゼロが返されます。エラーの場合は -1 が返され、errno が適切に設定されます。

于 2013-06-07T10:04:46.417 に答える