Как мне найти IP-адрес компьютера? - PullRequest
1 голос
/ 28 января 2009

Я пишу программу на C ++, которая использует сетевые сокеты. Мне нужно выяснить IP-адрес компьютера, чтобы я мог отобразить его пользователю. Программа должна работать в Windows и Linux.

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

Вот соответствующий код, который у меня уже есть (переменные объявлены в других местах):

master = new fd_set;
FD_ZERO(master);
struct sockaddr_in my_addr;

listener = socket(PF_INET, SOCK_STREAM, 0);

my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(port);
my_addr.sin_addr.s_addr = INADDR_ANY;
memset(my_addr.sin_zero, '\0', sizeof my_addr.sin_zero);

bind(listener, (struct sockaddr *)&my_addr, sizeof my_addr);

listen(listener, 10);

FD_SET(listener, master);

fdmax = listener;

Ответы [ 6 ]

5 голосов
/ 28 января 2009

Я опубликовал похожий вопрос, но недавно на OS X. ответ , который я получил, должен был использовать либо 0.0.0.0, либо INADDR_ANY. Это заставит ваш сокет прослушивать все доступные адреса, поэтому вам не нужно выяснять, какой из них «правильный».

5 голосов
/ 28 января 2009

Я где-то слышал, что компьютер может иметь несколько IP-адресов. я хочу тот, который другие программы на разные компьютеры могут использовать для подключения к компьютеру.

Ну ... это может быть любой из них. Если у компьютера несколько IP-адресов, к нему можно получить доступ на любом из них. Конечно, на одно из них могут распространяться различные правила брандмауэра, или они могут находиться в двух совершенно разных сегментах, но нет способа обнаружить все эти обстоятельства.

4 голосов
/ 28 января 2009

В Windows вы хотите использовать GetAdaptersAddresses - здесь перечислены все адаптеры вашего компьютера и IP-адреса, связанные с ними. Он также поддерживает адреса IPv6. Вы также можете использовать gethostbyname , но это не поддерживает IPv6.

В Linux мы читаем /proc/net/dev и /proc/net/if_inet6 и анализируем результаты этого.

2 голосов
/ 28 января 2009

Я полагаю, что вы можете использовать getaddrinfo () с вашим сокетом слушателя, чтобы получить IP-адрес сокета, с которым вы связаны.

0 голосов
/ 28 января 2009

Вы можете использовать облегченный класс сокета клиент / сервер в проекте C ++ для справки.

0 голосов
/ 28 января 2009

Это зависит от того, пытаетесь ли вы получить IP-адрес вашей локальной сети (то есть адрес вашего компьютера в наборе ваших компьютеров) или IP-адрес, который ваш поставщик услуг дает вам при каждом подключении к Интернету. Последнее может быть идентифицировано с помощью запроса (я полагаю, что вы найдете подходящую библиотеку C ++, которая делает это с небольшим поиском в Google) для некоторых веб-служб обнаружения IP.

Если вы хотите быстрое и грязное решение, вы можете попробовать http://www.whatismyip.org и прочитать его обратно.

...