getpeername(2) 接続している相手ソケットの名前を取得する

書式

#include <sys/socket.h>

int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

説明

getpeername() は、ソケット(socket) sockfd に接続している相手のアドレスを、 addr が指すバッファに格納して返す。 addrlen 引き数は、 addr が指している領域のサイズに初期化しておかなければならない。 関数が返る時には、 addrlen には実際に返された名前のサイズが (バイト単位で) 格納される。 提供されたバッファが小さすぎた場合には、名前は切り詰められる。

渡されたバッファが小さ過ぎた場合は、返されるアドレスの末尾が切り詰められる。 この場合には、 addrlen には、呼び出し時に指定された値よりも大きな値が格納される。

返り値

成功した場合は 0 が返される。エラーの場合は -1 が返され、 errno が適切に設定される。

エラー

EBADF
引き数 sockfd が有効なディスクリプタでない。
EFAULT
addr 引き数の指しているメモリが有効なプロセスのアドレス空間の 一部でない。
EINVAL
addrlen が不正である (例えば、負で場合など)。
ENOBUFS
この操作を行なうのに十分な資源がシステムに存在しない。
ENOTCONN
ソケットが接続していない。
ENOTSOCK
引き数 sockfd がソケットでなくてファイルである。

準拠

SVr4, 4.4BSD (getpeername() 関数は 4.2BSD で登場した), POSIX.1-2001.

注意

getpeername() の三番目の引き数は実際には `int *' である (4.x BSD, libc4, libc5 では このようになっている)。 POSIX では紆余曲折を経て現在の socklen_t になっており、 glibc でも socklen_t を使っている。 accept(2) も参照のこと。

ストリームソケットでは、 いったん connect(2) が実行されると、 どのソケットも getpeername() を使って相手ソケットのアドレスを取得できる。 一方、データグラムソケットはコネクションレスである (接続がない)。 データグラムソケットに対する connect(2) の呼び出しは、 write(2) や recv(2) で送信される出力データグラムの相手アドレスを設定するだけである。 connect(2) の呼び出し元は、 getpeername() を使って、それ以前にそのソケットに設定された相手アドレスを取得することができる。 しかし、相手ソケットはこの情報を知らないので、 相手ソケットで getpeername() を呼び出しても、 役に立つ情報は得られない (相手側でも connect(2) が呼び出されている場合を除く)。 なお、データグラムの受信側では recvfrom(2) を使って送信元アドレスを 取得できることも覚えておいてほしい。

この文書について

この man ページは Linux man-pages プロジェクトのリリース 3.65 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。