2017-08-29 18 views
-1

サーバには複数のインタフェースがあります。サーバーは0.0.0.0にバインドされています。つまり、サーバーはすべてのインターフェイスで待機しています。したがって、クライアントはこれらのサーバーIPのいずれかを使用して接続できます。 したがって、サーバー側では、クライアントが接続されているIPを取得する方法。サーバ側では、クライアントが接続されているサーバIPを取得します。

+0

@UlugToprak、私はSERVERのIPを要求し、クライアントのIPは要求しません。 – user2137306

+0

言葉がはっきりしていない、重複フラグを削除しました。 –

答えて

1

accept()によって返されたソケットにgetsockname()を使用すると、サーバーが受け入れたクライアントと通信するために使用しているローカルアドレスにバインドされます。

NAME 
    getsockname — get socket name 
LIBRARY 
    Standard C Library (libc, -lc) 
SYNOPSIS 
    #include <sys/types.h> 
    #include <sys/socket.h> 

    int 
    getsockname(int s, struct sockaddr * restrict name, 
    socklen_t * restrict namelen); 

DESCRIPTION 
    The getsockname() system call returns the current name for the specified 
    socket. The namelen argument should be initialized to indicate the 
    amount of space pointed to by name. On return it contains the actual 
    size of the name returned (in bytes). 
+0

*クライアント*がこのサーバと通信するために使用しているアドレスを返します* – EJP

+0

@EJP:いいえ、あなたは間違っています**サーバ側では** getsocknameは私が書いたようにサーバアドレスを返します。クライアントのアドレスを返すgetpeernameです。私はあなたが私の答え(getsockname)に-1を投票し、その直後に同じ答え(getsockname)を与えることを理解していません!公正ではない、あなたがSOと一緒に働いている方法。 –

+0

サーバでは、 'getsockname()'はクライアントがサーバへの接続に使用したアドレスを返します。これはサーバのIPアドレスのいずれかになります。ここに矛盾はありません。 'サーバがクライアントと通信するために使用している'クライアントの*独自のアドレスは、サーバ上で 'getpeername()'によって返されます。 – EJP

0

この情報は、getsockname()コールで入手できます。サーバー側で呼び出されると、クライアントがサーバーを起動するローカルサーバーアドレスが提供されます(accept)。

これは、本質的に接続がで受信したローカルインターフェイスは、必ずしもクライアントが使用するIPアドレスに対応していないことを意味し「弱いエンドシステムモデル」と呼ばれる難解なもの、の対象となることを

注意(何を考えますプロキシ/ルーターがクライアントとサーバーの間にある場合に発生します)。その場合、実際にクライアントが実際のIPにすることはできません(クライアントがデータパケットでサーバに送信しない限り)。クライアント上のIPだけが受け入れられます。

+0

@downvoter自分自身を育てないでください。調べる。それのすべて。ここにエラーはありません。 – EJP

関連する問題