как найти ip-адрес сокета c ++ / c - PullRequest
0 голосов
/ 28 октября 2011

Я хочу знать, как получить IP-адрес клиента, который подключается к сокету на сервере с помощью команды accept. Как бы я это сделал? getpeername возвращает неправильный IP-адрес, и я не могу найти другой способ сделать это.

На сервере после принятия возврата я делаю это:

            char buf[INET_ADDRSTRLEN];
            struct sockaddr name; socklen_t len = sizeof(name);
            getpeername(sock_fd, &name, &len); //sock_fd is the socket im using
            inet_ntop(AF_INET, &name, buf, INET_ADDRSTRLEN);
            string ip = buf;

Ответы [ 3 ]

5 голосов
/ 28 октября 2011

2-й параметр accept содержит эту информацию.

3 голосов
/ 28 октября 2011

У вас есть несколько ошибок:

  • Не следует создавать объект типа struct sockaddr.Вместо этого вы должны использовать struct sockaddr_in или struct sockaddr_in6 в зависимости от типа сокета;
  • Вы должны проверить возвращаемое значение getpeername() на наличие ошибок.
  • Вы должны передатьуказатель на struct in_addr или struct in6_addr на inet_ntop(), а не указатель на sockaddr.

Он должен выглядеть следующим образом:

char buf[INET_ADDRSTRLEN] = "";
struct sockaddr_in name;
socklen_t len = sizeof(name);

if (getpeername(sock_fd, (struct sockaddr *)&name, &len) != 0) {
    perror("getpeername");
} else {
    inet_ntop(AF_INET, &name.sin_addr, buf, sizeof buf);
}

Вам не нужноиспользуйте getpeername(), однако - вместо этого вы можете передать (struct sockaddr *)&name и &len в качестве второго и третьего параметров accept() и продолжить оттуда.

1 голос
/ 28 октября 2011

Неожиданное предположение, основанное на доступной в настоящее время ограниченной информации: убедитесь, что вы звоните getpeername() по принятому соединению, а не через прослушивающий сокет.

Когда возвращается getpeername(), он записывает чтовероятно будет структура in_addr_t (или in6_addr!).Используйте процедуру типа inet_ntoa для форматирования и отображения результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...