Как получить IP-адрес в интернете из структуры sockaddr (не IP-адреса маршрутизатора)? - PullRequest
0 голосов
/ 28 марта 2012

У меня есть сервер, закодированный на C. После accept() я хочу получить IP-адрес от sockaddr.Но я получаю IP-адрес от виртуальной машины, на которой я работаю: 10.0.xx, а не интернет-IP.Виртуальная машина размещена на компьютере с реальным IP-адресом, который я хотел бы получить.

Переадресация портов выполнена.Пример: у меня 2 компьютера, на которых установлена ​​одна и та же виртуальная машина, поэтому у них одинаковый локальный IP-адрес виртуальной машины (10.0.xx).Первая виртуальная машина запускает сервер, вторая использует telnet для подключения с использованием реального IP-адреса сервера (147.xxx).Соединение установлено правильно, но IP-адрес, который я получаю в sockaddr, является виртуальным.

Знаете ли вы, как решить его?

Ответы [ 3 ]

3 голосов
/ 28 марта 2012

Вам понадобится сторонний сервер, например, (веб) сервер, который просто вернет / распечатает удаленный IP-адрес активного соединения.Таким образом, вы сможете получить свой «интернет-IP», находясь за локальным NAT.

0 голосов
/ 28 марта 2012

Может быть, я не прав с этим ... однако кажется, что ваша виртуальная машина настроила для себя "внутреннюю" сеть (следовательно, 10.0 .... IP). По моему опыту, это произошло, когда виртуальная машина была настроена для работы в сети с типом NAT, а служба DHCP VM была запущена. Попробуйте с мостом. Это может дать вам более одного сетевого интерфейса, поэтому вам нужно будет указать серверу, к какому именно интерфейсу он должен быть привязан / прослушан. Существует некоторый код для получения интерфейсов для различных операционных систем на http://pici -nms.cvs.sourceforge.net / viewvc / pici-nms / common / NetworkInterface.cpp? View = markup , а также для привязка к запрашиваемому интерфейсу.

0 голосов
/ 28 марта 2012
uint32_t getip(int clientSock)
{
    socklen_t len;
    struct sockaddr_storage addr;
    struct sockaddr_in *s;

    len = sizeof addr;
    int res = getpeername(clientSock, (struct sockaddr*)&addr, &len);
    if ( 0 != res ) {
            return 0;
    }

    if (addr.ss_family == AF_INET)
            s = (struct sockaddr_in *)&addr;
    else // apparently AF_INET6
        return 0;

    return s->sin_addr.s_addr;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...