0

サーバーに、接続された TCP ソケットからクライアントのソース IP とポートを判別させたいと考えています。私のクライアントは NAT の背後にある可能性が高いため、(接続のプロトコルで) クライアントからの指示に頼ることはできません... これが可能であれば、Windows と Linux の両方に実装する必要があります。 ..しかし、どちらかに対する答えは、私が始めるのに役立ちます...

私は C を使用しており、libc または msvcrt ベースのソリューションを探しています。

4

3 に答える 3

3

ピアが NAT の背後にある場合、2 つの異なる IP について話している可能性があります (質問からは、どちらが必要かは不明です)。

  • 内部ネットワーク内のピアの IP (例: 192.168.1.2);
  • NAT 自体の外部 IP

前者の場合、TCP/IP スタックから利用できる解決策はありません。NAT はすべての内部 IP をすべてのパケットの独自の IP に置き換えるため、この情報はホスト上に存在しません。したがって、唯一の解決策は、プロトコルでこの機能をサポートすることです。

後者の場合は、TCP/IP スタックに問い合わせることができます: getpeername()がその方法です。

于 2011-06-09T18:12:19.970 に答える
3

Linux と Windows の両方で動作するはずです。

struct sockaddr_in addr;
socklen_t len;

len = sizeof addr;
getpeername(clientSocket, (struct sockaddr*)&addr, &len);
printf("Remote IP address: %s\n", inet_ntoa(addr.sin_addr));
于 2011-06-09T18:20:53.120 に答える
0

クライアントがNATの背後にある場合、リモートIPを検出する方法はありません。これを行おうとすると、常にNATIPが取得されます。私が知っている唯一の方法は、クライアントIPをリクエストと一緒に(リクエストの一部として)サーバーに送信することです。

しかし、あなたはあなたが何を望んでいるのかはっきりしていません。使用している言語や、話しているサーバーの種類を教えてくれません。これにより、役立つ回答を提供できなくなります。

于 2011-06-09T16:48:23.917 に答える