0

サーバー (A) とクライアント (B) を C で記述し、同じ Linux マシンで実行しています。サーバーはポートを INADDR_ANY にバインドし、クライアントは別のポートを INADDR_ANY にバインドします。別のLinux マシンで実行されている別のクライアント (C) がサーバーに接続するときに、サーバーがクライアント B の IP アドレスを取得し、それをクライアント C に送信するようにします。

サーバーから getpeername() を使用すると、正しい「127.0.0.1」が返されますが、このアドレスをクライアント C に送信できません。そのアドレスでクライアント B に接続することはできません。

クライアント B の実際の IP を取得するスマートな方法はありますか? 多少簡単な場合は、各クライアントに IP をサーバーに送信させることができます。

ありがとう!

4

2 に答える 2

0

インターフェイスの IP アドレスを取得するにはgetifaddrs()を使用します。manページに例があります。INADDR_ANYサーバーは を使用してバインドされているため、すべてのインターフェイスでリッスンするため、任意のインターフェイスの IP アドレスを送信できることに注意してください。man ip(7)から

bind 呼び出しで INADDR_ANY が指定されている場合、ソケットはすべてのローカル インターフェイスにバインドされます。

パブリックIP アドレスが必要な場合は、次の質問を参照してください。

パブリック/外部 IP アドレスを取得しますか?

于 2013-01-07T12:36:49.073 に答える
0

実際に知りたいのは、クライアント C へ
のルーティングに使用されるインターフェースの IP アドレスです。

# ip route show match 10.0.0.1
default via 20.0.0.2 dev eth0
# ifconfig eth0
eth0        Link encap:Ethernet  HWaddr 00:00:00:00:00:00
            inet addr:20.0.0.3  Bcast:20.0.0.255  Mask:255.255.255.0

この場合、 を使用します20.0.0.3

これらすべてを C でどのように取得するかという問題が残っています。1 つの方法は、C で何らかのサービスに接続しgetsockname、結果のソケットで実行することです。

于 2013-01-07T13:16:04.720 に答える