C++ socket(…) Как получить свой айпи?

357
23 января 2018, 12:26

У меня есть программа сервер. У меня получается к нему подключаться по всем 3 ip:

127.0.0.1 локально

192.168.1.3 роутер

109.127.85.64 интернет

Я только UDP смог сделать чтобы работало.

Как можно узнать свой айпишник в сети?(программе надо, я то на 2ip могу узнать). Может через какой-то ресурс можно? Или какой функцией особой. На линукс надо.

Answer 1

Элементарного способа сделать это нет. Во-первых нужен, какой-то внешний сервис, который ответит на наш запрос, можно даже тот же 2ip использовать, но лучше найти какой-то попроще и поинтернациональней, например ipecho.net. Во-вторых с сервисом нужно будет взаимодействовать по какому-то протоколу, обычно это http и для этого понадобится сторонняя библиотека или программа(вариант ).

Самый простой/топорный способ использовать wget и popen(3) (обработка ошибок опущена):

#include <stdio.h>
// ...
char ipaddr[16];
FILE *f = popen ("wget -qO - http://ipecho.net/plain","r");
fnscanf (f, 16, "%s", ipaddr);
fclose (f);
// в ipaddr получаем адрес в обычной точечено-десятичной форме.

Минус в данном подходе — зависимость от внешней программы, хотя он же является и плюсом: это позволяет предоставить пользователю возможность настраивать сервис запроса на уровне команды, так что если сторонний сервис перестанет работать, у пользователя будет простой способ поменять его.

Альтернативы/дальнейшие усовершенствования:

  • Само собой, можно выбрать любой другой сервис для запроса.
  • Можно добавить неблокирующий ввод/вывод.
  • Можно использовать использовать библиотеку libcurl или какой-либо другой http клиент по собственному выбору для запросов.
  • Если уходить от сервисов на основе http, то есть, например, opendns.com, который при DNS запросе адреса myip.opendns.com на один из его серверов, например resolver1.opendns.com, возвращает адрес запрашивающего. т.е. если реализовывать всё на низкоуровневых сокетах, достаточно будет одного DNS запроса аналогичного nslookup myip.opendns.com resolver1.opendns.com.
READ ALSO
Подставляемая функция

Подставляемая функция

В чём смысл подставляемой функции в С++? Я понимаю перед типом возвращаемого значения нужно писать inline? Но в чём все-таки разница между обычной...

253
Функция работает неправильно 2018

Функция работает неправильно 2018

Есть список и есть функция addДобавляем элементы, а с функцией doubling удваиваем

294
массив символов С++

массив символов С++

Почему выводит весь массив символов(всю строку)? Если там будет,допустим, массив целочисельный,то выведет всего лишь адрес первого элемента

234
статическая переменная в классе

статическая переменная в классе

Для чего нам нужно еще раз объявлять статическую переменную вне класса, указывать область видимости, если я уже в классе определил ее как...

241