ソケットから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"とか出る)
だれだこの関数作ったやつ仕事適当すぎんだろ