ОБЗОР
#include <sys/socket.h>
int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
ОПИСАНИЕ
getpeername() возвращает адрес машины, подключившейся к сокету sockfd,
в буфер, указанный addr. В параметре addrlen должно быть указано,
сколько места выделено, на которое указывает addr. По возвращении он
содержит реальный размер памяти, занимаемый возвращаемым именем (в
байтах). Имя обрезается, если буфер окажется слишком мал.
Возвращаемый адрес урежется, если предоставленный буфер окажется слишком маленьким; в этом случае в 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).
ЗАМЕЧАНИЯ
Третий аргумент функции getpeername() в действительности имеет тип int * (это именно так в 4.x BSD, libc4 и libc5). Определённое недопонимание
привело к тому, что в стандарте POSIX появился тип socklen_t также
используемый в glibc. Смотрите также accept(2).
Для потоковых сокетов после выполнения connect(2) любой сокет может вызвать getpeername() для получения адреса соседа (peer). С другой стороны, дейтаграмные сокеты не устанавливают соединения. Вызов connect(2) для дейтаграмного сокета просто задаст адрес соседа в исходящих дейтаграммах, посылаемых с помощью write(2) или recv(2). Вызывающий connect(2) может использовать getpeername() для получения адреса соседа., который был установлен у сокета ранее. Однако, сокет соседа не знает про это и вызов getpeername() для сокета соседа не вернёт полезной информации (если сосед также не вызвал connect(2)). Заметим, что получатель дейтаграммы может получить адрес отправителя, если использует recvfrom(2).