Это архив сайта coldflame.by.ru, он не обновлялся с 2007 года. Мой современный сайт тут: http://leonid.shevtsov.me.
Домой! Обо мне Специально для РИ-06-1 Разнообразное... барахло, короче :) Программы и прочее Статьи и переводы Блог SmartDaemon
Предыдущая ОглавлениеСледующая

getpeername()

Получить адрес удаленного конца соединения

Прототип

#include <sys/socket.h>

int getpeername(int s, struct sockaddr *addr, socklen_t *len);

Описание

Когда ты либо принял соединение через accept(), либо соединился с сервером через connect(), у соединения появляется второй конец (peer).

getpeername() возвращает struct sockaddr_in, заполненную информацией об удаленной машине.

Почему же тогда "name"? Есть куча разных видов сокетов, а не только Internet Sockets, которые используем мы, и "имя" было удобным обобщающим термином. В нашем случае, "имя" - это IP-адрес и порт.

Хотя функция возвращает длина адреса в len, нужно указать в len длину addr еще до вызова.

Возвращаемое значение

Возвращает ноль при успехе, -1 при ошибке, и сохраняет ее номер в errno.

Пример

int s;
struct sockaddr_in server, addr;
socklen_t len;

// создаем сокет
s = socket(PF_INET, SOCK_STREAM, 0);

// соединяемся с сервером
server.sin_family = AF_INET;
inet_aton("63.161.169.137", &server.sin_addr);
server.sin_port = htons(80);

connect(s, (struct sockaddr*)&server, sizeof(server));

// получаем имя "собеседника"
// мы только что соединились с 63.161.169.137:80, так что результат должен быть:
//    IP-адрес собеседника : 63.161.169.137
//    Порт собеседника     : 80

len = sizeof(addr);
getpeername(s, (struct sockaddr*)&addr, &len);
printf("IP-адрес собеседника : %s\n", inet_ntoa(addr.sin_addr));
printf("Порт собеседника     : %d\n", ntohs(addr.sin_port));

См. также

gethostname(), gethostbyname(), gethostbyaddr()


Предыдущая ОглавлениеСледующая