У меня есть сервер с входящим сокетом от клиента.
Мне нужно получить IP-адрес удаленного клиента.
Пробовал поиск google для in_addr
, но это немного хлопотно.
Любые предложения?
Получение адреса источника входящего сокета
Ответ 1
Вам нужна функция getpeername
:
// assume s is a connected socket
socklen_t len;
struct sockaddr_storage addr;
char ipstr[INET6_ADDRSTRLEN];
int port;
len = sizeof addr;
getpeername(s, (struct sockaddr*)&addr, &len);
// deal with both IPv4 and IPv6:
if (addr.ss_family == AF_INET) {
struct sockaddr_in *s = (struct sockaddr_in *)&addr;
port = ntohs(s->sin_port);
inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
} else { // AF_INET6
struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
port = ntohs(s->sin6_port);
inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
}
printf("Peer IP address: %s\n", ipstr);
Ответ 2
Предполагая, что вы используете accept()
для приема входящих соединений сокетов, getpeername()
не требуется. Информация о адресе доступна через 2-й и 3-й параметры вызова accept()
.
Здесь Eli ответил измененным, чтобы сделать это без getpeername()
:
int client_socket_fd;
socklen_t len;
struct sockaddr_storage addr;
char ipstr[INET6_ADDRSTRLEN];
int port;
len = sizeof addr;
client_socket_fd = accept(server_socket_fd, (struct sockaddr*)&addr, &len);
// deal with both IPv4 and IPv6:
if (addr.ss_family == AF_INET) {
struct sockaddr_in *s = (struct sockaddr_in *)&addr;
port = ntohs(s->sin_port);
inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
} else { // AF_INET6
struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
port = ntohs(s->sin6_port);
inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
}
printf("Peer IP address: %s\n", ipstr);
Ответ 3
Поскольку вы говорите, что это входящее соединение от клиента, в качестве альтернативы getpeername
вы можете просто сохранить адрес, который был возвращен вызовом accept()
, во втором и третьем параметрах.