サーバーに、接続された TCP ソケットからクライアントのソース IP とポートを判別させたいと考えています。私のクライアントは NAT の背後にある可能性が高いため、(接続のプロトコルで) クライアントからの指示に頼ることはできません... これが可能であれば、Windows と Linux の両方に実装する必要があります。 ..しかし、どちらかに対する答えは、私が始めるのに役立ちます...
私は C を使用しており、libc または msvcrt ベースのソリューションを探しています。
ピアが NAT の背後にある場合、2 つの異なる IP について話している可能性があります (質問からは、どちらが必要かは不明です)。
前者の場合、TCP/IP スタックから利用できる解決策はありません。NAT はすべての内部 IP をすべてのパケットの独自の IP に置き換えるため、この情報はホスト上に存在しません。したがって、唯一の解決策は、プロトコルでこの機能をサポートすることです。
後者の場合は、TCP/IP スタックに問い合わせることができます: getpeername()がその方法です。
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));
クライアントがNATの背後にある場合、リモートIPを検出する方法はありません。これを行おうとすると、常にNATIPが取得されます。私が知っている唯一の方法は、クライアントIPをリクエストと一緒に(リクエストの一部として)サーバーに送信することです。
しかし、あなたはあなたが何を望んでいるのかはっきりしていません。使用している言語や、話しているサーバーの種類を教えてくれません。これにより、役立つ回答を提供できなくなります。