Перечисление сетевых интерфейсов
Автор: Konstantin Malahov
Источник: www.varkon.biz
В процессе работы твоей программы нередко надо получить список сетевых адресов доступных на данном компьютере, что бы в дальнейшем этот список использовать для своих задач.
Способов как это реализовать существует несколько - и наиболее распространенный - это использовать API операционной системы. Этого вполне хватит за глаза для большинства задач. Правда есть одна проблема - операционных систем много, и Windows - всего лишь одна из них. Есть еще и, так называемое семейство *nix-подобных систем, к которым относится Linux, MacOS и еще множество других. А хороший программист (а ты ведь хороший программист, не так ли) должен учитывать такие нюансы.
Но на самом деле ничего страшного в этом нет. Во первых, есть языки (например Java, Perl, PHP, Python etc), которым вообще не важна ОС - главное что бы, была соответствующая виртуальная машина или интерпретатор. Но об этом позже. Будет настроение - я уделю этим языкам отдельную статью, в связи с тем что это совершенно другая идеология и методы.
Во вторых - ты можешь для каждой системы компилировать необходимый бинарный файл - это не так удобно, как первый вариант - но зато на несколько порядков быстрее и эффективнее. Но после каждого изменения - да, надо снова все перекомпилировать. Нет счастья на земле. Но нет его и выше... Или как сказал другой поет:
Нет счастья на земле.
Ни с Запада, ни с юга
Не увидать его ни в небе, ни в аду...
Мы с каждым днем, увы,
Несчастней друг для друга...
Остановите землю, - я сойду!
Но впрочем оставим романтику бардам, им тоже надо в лесах о чем то петь.
В *nix-подобных системах для получения списка сетевых интерфейсов используется системный вызов ioctl, а в вынодоус - все естественно не так, там для этих целей служит WSAIoctl. И как с этим жить? Да собственно так и живем, ничего страшного. Для этого в C/C++ существует такая замечательная штука как директива условной компиляции #ifdef которая позволяет управлять, что мы включим в код, а что оставим за бортом. Перед компиляцией выполняется специальный проход - препроцессинг, который определяет, что подавать компилятору на обработку, а что выкинуть(или преобразовать) - это называется директивы препроцессора. Что это такое, с чем его едят - читай по ссылке. К теме это не относится.
Дальше собственно код:
Код:
* hs_lookup.c
* author: k0t aka dr0zd714 aka varkon
* e-mail: Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript
* site: http://varkon.biz
* for hackersoft.ru
*/
#ifdef WIN32 || WIN64
#pragma comment(lib,"ws2_32.lib")
#include <winsock2.h>
#else
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <net/if.h>
#endif
#include <stdio.h>
/***
*
* lookup_addr_indx()
*
*/
#define BUF_SIZE 4092
int lookup_addr_indx(int indx,
unsignedint*addr)
{
#ifdef WIN32 || WIN64
LPSOCKET_ADDRESS_LIST list =NULL;
SOCKET sc =0;
char buf[BUF_SIZE];
int len =0;
int ret =0;
sc = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
if(sc == INVALID_SOCKET){
return(-1);
}
ret = WSAIoctl(sc,
SIO_ADDRESS_LIST_QUERY,
NULL,
0,
buf,
BUF_SIZE,
(unsignedlong*)&len,
NULL,
NULL);
closesocket(sc);
if(ret !=0|| len <=0){
return(-2);
}
list =(LPSOCKET_ADDRESS_LIST) buf;
if(list->iAddressCount <=0){
return(-3);
}
for(int i =0; i <= indx && i < list->iAddressCount;++i){
//нашли адрес
if(i == indx){
memcpy(addr,
&list->Address[i].lpSockaddr->sa_data[2],4);
return(1);
}
}
//адресов не осталось
return(0);
#else
struct ifconf ifc;
struct ifreq *ifr =NULL;
char buf[BUF_SIZE];
int ret =0;
int off =0;
int cnt =0;
int cdx =0;
int sc =0;
sc = socket(AF_INET, SOCK_DGRAM, 0);
if(sc <0){
return(-1);
}
ifc.ifc_len= BUF_SIZE;
ifc.ifc_buf= buf;
ret = ioctl(sc, SIOCGIFCONF, &ifc);
if(ret <0){
return(-2);
}
ifr = ifc.ifc_req;
while(cnt < ifc.ifc_len&& cdx <= indx){
if(ifr->ifr_addr.sa_family== AF_INET){
if(cdx == indx){
memcpy(addr, &ifr->ifr_addr.sa_data[2], 4);
return(1);
}
++cdx;
}
off = IFNAMSIZ + ifr->ifr_addr.sa_len;
cnt += off;
((char*) ifr)+= off;
}
close(sc);
#endif
return(0);
}
int main(void)
{
#ifdef WIN32 || WIN64
WSADATA wsa;
#endif
struct in_addr ia;
unsignedint addr =0;
int ret =0;
int idx =0;
#ifdef WIN32 || WIN64
memset(&wsa, 0x0, sizeof(WSADATA));
if(WSAStartup(MAKEWORD(2, 0), &wsa)!=0x0){
printf("WSAStartup error! \n");
return(1);
}
#endif
while(1){
ret = lookup_addr_indx(idx, &addr);
if(ret <0){
printf("lookup_addr_indx error. Code %d \n", ret);
return(1);
}
elseif(ret ==0){
break;
}
ia.s_addr= addr;
printf("address %d: %s\n", idx, inet_ntoa(ia));
++idx;
printf("End list address. Seach %d\n", idx);
return(0);
}
}
Как видишь - сложного в данном коде ничего нет. Все просто. Получаем адреса - и выводим их на экран. Результат работы программы под вындоус выглядит примерно так:
D:\Progects\mingw\hs_lookup\bin\hs_lookup.exe
address 0 192.168.1.100
address 1 192.168.2.12
End list address. Seach 2
под линух
dr0zd714# ./hs_lookup
address 0 127.0.0.1
address 1 192.168.2.16
End list address. Seach 2
Ну либо используем так, как необходимо. На что надо обратить внимание - это размер буфера - BUF_SIZE, если ты компилируешь программу под WIN64 - возможно его надо увеличить. А возможно и нет - экспериментируй и проверяй все на практике. На 64-х разрядной системе это не тестировалось. Естественно, в коде могут быть опечатки - так как набирал его руками - опять же, я полагаю, что если ты берешься за сетевое программирование - то ты имеешь некоторый опыт, по этому проблем иметь не должен. Если такового ты не имеешь - то получи его.
В остальном - если будут адекватные вопросы - с удовольствием отвечу. Код предназначен для свободного использования и распространения.
Источник: http://feedproxy.google.com/~r/codenet/read/~3/wKwU7WFwEF8/


Поделиться статьей:
Акция: Закажи любой сайт до окончания акции и получи скидку + подбор семантического ядра + поисковую оптимизацию сайта Это позволит Вам получать еще больше трафика и соответственно клиентов из Интернета!
До конца акции осталось
0
5
4
3
2
1
0
0
9
8
7
6
5
4
3
2
1
0
0
5
4
3
2
1
0
0
9
8
7
6
5
4
3
2
1
0
0
9
8
7
6
5
4
3
2
1
0
0
9
8
7
6
5
4
3
2
1
0
|
Узнайте подробности акции у менеджеров компании по телефонам: 8-924-200-7194 г.Хабаровск 8-800-550-9899 Бесплатно по России (с 2:30 до 11:30 по Мск) |
Новые статьи и публикации
- 2023-01-26 » Установка и настройка Call tracking и Email tracking
- 2022-11-09 » 12 работающих формул продающих текстов
- 2022-11-09 » Дизайн сайта как SEO фактор ранжирования в 2022. Неочевидные нюансы в дизайне
- 2022-09-06 » Яндекс выложил в опенсорс фреймворк для ускорения разработки мобильных приложений
- 2022-08-18 » Как я могу перенаправить и переписать свои URL-адреса с помощью файла .htaccess?
- 2022-08-01 » Яндекс выложил в опенсорс исходный код и документацию фреймворка userver
- 2022-07-29 » Как выявить медленные SQL запросы?
- 2022-07-29 » Читали мое письмо или нет? Как проверить с помощью php — Записки программиста
- 2022-07-26 » Я потратил 30 дней на анализ лучших кнопок призыва к действию, которые смог найти в Интернете
- 2022-06-29 » ТОП-15 актуальных трендов интернет-маркетинга для России: эксперт рассказал о тенденциях рынка в 2022 году
- 2022-06-21 » Почему «99 франков» — это не лучшая ценовая стратегия, и как теперь «рисовать» привлекательные цены
- 2022-06-16 » Пушкинская карта и Культура.РФ на Вашем сайте. Подключим к действующему сайту и(или) сделаем новый!
- 2022-05-18 » Анализ рынка интернет-маркетинга в РФ от Яндекс Дзен
- 2022-05-18 » Итоги развития рекламного рынка РФ за 2021 год по версии АКАР
- 2022-05-18 » Потребление мобильного трафика в Рунете достигло рекордных значений
- 2022-05-17 » Yappy, TenChat и другие. Обзор новых русских соцсетей и их возможностей
- 2022-05-17 » Реклама малого бизнеса. Разбор доступных каналов, инструментов аналитики и терминов
- 2022-05-16 » Зачем нужен счетчик Top@Mail.ru и как установить на сайт пиксель myTarget
- 2022-04-25 » Несмотря на отсутствие блокировки: в Youtube потеряли более 20% активных русскоязычных авторов
- 2022-04-25 » Чат-бот – что это такое
- 2022-04-19 » Комплексная услуга по разработке сайта или Интернет-магазина БЕСПЛАТНО!!!
- 2022-03-17 » Импорт большого дампа БД в OpenServer через консоль
- 2022-02-25 » Возможности и преимущества Google Analytics 4
- 2022-02-20 » Интеграция Интернет-магазинов и сайтов с маркетплейсами в несколько кликов – РЭДЛАЙН! ыходи на Маркетплейсы — кратно увеличь свои продажи!
- 2022-01-26 » Анализ и отслеживание конверсий
- 2022-01-26 » Создаем сайты на Тильде с маркетинговой проработкой!
- 2022-01-26 » Разработка сайтов на Wordpress "под ключ"
- 2022-01-18 » Основные UX-тренды 2022 года
- 2021-12-24 » Как увеличить продажи перед Новым годом
- 2021-12-23 » Ключевые запросы − основа эффективного продвижения
Предоставляем полный комплекс услуг по созданию, обслуживанию и продвижению сайтов по всей России и ближнему зарубежью с 2006 года!
Как мы работаем
Заявка
Позвоните или оставьте заявку на сайте.
Консультация
Обсуждаем что именно Вам нужно и помогаем определить как это лучше сделать!
Договор
Заключаем договор на оказание услуг, в котором прописаны условия и обязанности обеих сторон.
Выполнение работ
Непосредственно оказание требующихся услуг и работ по вашему заданию.
Поддержка
Сдача выполненых работ, последующие корректировки и поддержка при необходимости.