getpeername -
接続している相手ソケットの名前を取得する
#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
がソケットを参照していない。
POSIX.1-2001, POSIX.1-2008, SVr4, 4.4BSD (
getpeername()
関数コールは 4.2BSD
で初めて登場した)。
For background on the
socklen_t type, see
accept(2).
ストリームソケットでは、
いったん
connect(2)
が実行されると、
どのソケットも
getpeername()
を使って相手ソケットのアドレスを取得できる。
一方、データグラムソケットはコネクションレスである
(接続がない)。
データグラムソケットに対する
connect(2) の呼び出しは、
write(2) や
recv(2)
で送信される出力データグラムの相手アドレスを設定するだけである。
connect(2)
の呼び出し元は、
getpeername()
を使って、それ以前にそのソケットに設定された相手アドレスを取得することができる。
しかし、相手ソケットはこの情報を知らないので、
相手ソケットで
getpeername()
を呼び出しても、
役に立つ情報は得られない
(相手側でも
connect(2)
が呼び出されている場合を除く)。
なお、データグラムの受信側では
recvfrom(2)
を使って送信元アドレスを
取得できることも覚えておいてほしい。
accept(2),
bind(2),
getsockname(2),
ip(7),
socket(7),
unix(7)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。