揮発性のメモ2

知識をメモ書きしておく

getpeername()

ソケットからsockaddr構造体を引っ張ってくる関数
Man page of GETPEERNAME
Man page of GETNAMEINFO

#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
void print_peername( int sd )
{
    struct sockaddr_storage addr;   // ソケットアドレス
    socklen_t addrlen;              // ソケットアドレス長
    char host[256];                 // ホスト名表示用
    int result;
    
    // アドレス情報取得
    result = getpeername( sd, (struct sockaddr*)&addr, &addrlen );
    if( result<0 ){
        perror("getpeername");
        return;
    }
    
    // 相手の名前を取得
    result = getnameinfo( (struct sockaddr*)&addr, addrlen, host, sizeof(host), NULL, 0, 0 );
    if( result!=0 ){
        fprintf( stderr,"getnameinfo: %d(%s)\n", result, gai_strerror(result) );
        return;
    }

    // 表示
    printf( "peername is %s\n", host );
}


getnameinfo()を使用する際、ホスト名のバッファが十分に取られていなくてオーバーフローする場合に、エラー -11 または -12 が返る。

/* Error values for `getaddrinfo' function.  */
# define EAI_BADFLAGS     -1    /* Invalid value for `ai_flags' field.  */
# define EAI_NONAME       -2    /* NAME or SERVICE is unknown.  */
# define EAI_AGAIN        -3    /* Temporary failure in name resolution.  */
# define EAI_FAIL         -4    /* Non-recoverable failure in name res.  */
# define EAI_FAMILY       -6    /* `ai_family' not supported.  */
# define EAI_SOCKTYPE     -7    /* `ai_socktype' not supported.  */
# define EAI_SERVICE      -8    /* SERVICE not supported for `ai_socktype'.  */
# define EAI_MEMORY       -10   /* Memory allocation failure.  */
# define EAI_SYSTEM       -11   /* System error returned in `errno'.  */
# define EAI_OVERFLOW     -12   /* Argument buffer overflow.  */

何が返るかはライブラリのバージョンに大きく左右されるはずだが、現状とりあえず
名前が引けない(IPアドレス表記を返す)ときは -11 システムエラーとなり、errnoは ENOSPC(No space left on device)になる
名前が引けるときには -12 が返る。作ってる途中なのか gai_strerror() で文字列が出てこない。("Unknown error"とか出る)
だれだこの関数作ったやつ仕事適当すぎんだろ