2011-01-02 4 views
0

私のlinuxのC++アプリケーションでは、ソケットピアがローカルの場合に関数のハットが与えられたソケットをチェックします。すべてのローカルIPを取得する方法はわかっていますが、ソケットピアがローカルIPSリストのものかどうかを確認する方法はわかりません。ソケットピアを取得するIPS linux

助けてくださいか?コードでお願いします!

10倍

+0

あなたはあなたが持っているものを投稿できますか? – Anonymoose

答えて

1

あなたはソケットのピア側のためgetpeername()を探しています。ソケットのローカル側にgetsockname()を使用してください。次のスニペットは、インターネットドメイン内のソケットローカルおよびピアアドレスを取得します。あなたが必要な場合は、他のタイプのソケットを扱うためにそれを拡張するためにあなたに任せておきます。私はいくつかの初歩的なエラーチェックをボーナスとして含めました。

int 
get_addresses(int sd, struct sockaddr_in *local_ptr, 
       struct sockaddr_in *peer_ptr) 
{ 
    int rc = -1; 
    if (local_ptr == NULL || peer_ptr == NULL) { 
     errno = EFAULT; 
     return rc; 
    } 
    if (sd == -1) { 
     errno = EBADF; 
     return rc; 
    } 
    if (local_ptr->sin_family != AF_INET || peer_ptr->sin_family != AF_INET) { 
     errno = EINVAL; 
     return rc; 
    } 

    rc = getsockname(sd, (struct sockaddr*)local_ptr, 
        sizeof(struct sockaddr_in)); 
    if (rc == 0) { 
     rc = getpeername(sd, (struct sockaddr*)local_ptr, 
         sizeof(struct sockaddr_in)); 
     if (rc < 0) { 
      if (errno == ENOTCONN) { 
       /* socket is not connected so zero out the peer side */ 
       peer_ptr->sin_len = sizeof(struct sockaddr_in); 
       peer_ptr->sin_family = AF_INET; 
       peer_ptr->sin_port = 0; 
       peer_ptr->sin_addr.s_addr = INADDR_NONE; 
       rc = 0; 
      } 
     } 
    } 
    return rc; 
} 
+0

getpeernameはすべてのピアアドレス(ピア内のすべてのNICアドレス)を取得しますか? – gln

+0

@ginいいえ、ちょうどあなたの端が接続されているアドレス。 – Duck

+0

どのシステムコールがピアのすべてのアドレスを取得できますか? – gln