У меня есть программа сервер. У меня получается к нему подключаться по всем 3 ip:
127.0.0.1
локально
192.168.1.3
роутер
109.127.85.64
интернет
Я только UDP смог сделать чтобы работало.
Как можно узнать свой айпишник в сети?(программе надо, я то на 2ip могу узнать). Может через какой-то ресурс можно? Или какой функцией особой. На линукс надо.
Элементарного способа сделать это нет. Во-первых нужен, какой-то внешний сервис, который ответит на наш запрос, можно даже тот же 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 получаем адрес в обычной точечено-десятичной форме.
Минус в данном подходе — зависимость от внешней программы, хотя он же является и плюсом: это позволяет предоставить пользователю возможность настраивать сервис запроса на уровне команды, так что если сторонний сервис перестанет работать, у пользователя будет простой способ поменять его.
Альтернативы/дальнейшие усовершенствования:
myip.opendns.com
на один из его серверов, например resolver1.opendns.com
, возвращает адрес запрашивающего. т.е. если реализовывать всё на низкоуровневых сокетах, достаточно будет одного DNS запроса аналогичного nslookup myip.opendns.com resolver1.opendns.com
.Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
В чём смысл подставляемой функции в С++? Я понимаю перед типом возвращаемого значения нужно писать inline? Но в чём все-таки разница между обычной...
Есть список и есть функция addДобавляем элементы, а с функцией doubling удваиваем
Почему выводит весь массив символов(всю строку)? Если там будет,допустим, массив целочисельный,то выведет всего лишь адрес первого элемента
Для чего нам нужно еще раз объявлять статическую переменную вне класса, указывать область видимости, если я уже в классе определил ее как...