Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Помогите с программой (работа с локальной сетью)


Автор: Игорь007 17.5.2008, 21:48
Всем привет.
До этого вроде с С (по учебной программе) справлялся, но сейчас дали задание, даже не знаю с какой стороны подойти  
Нужно обзвонить локальную сеть, после чего вывести отсортированный список компьютеров по времени отзыва. С сортировкой списка понятно, но как взять список компьютеров и время отзыва? 
Под линухой (Mandriva) на С (хотя можно и Cpp).

Автор: Artemon 18.5.2008, 09:19
Посылаем пинг на все адреса сети, которые откликнулись - запоминаем, затем пытаемся получить имя ПК по IP.

Автор: Игорь007 18.5.2008, 14:02
А откуда адреса сети взять?

Автор: GrayCardinal 18.5.2008, 15:52
Игорь007, 
Берешь твой IP, берешь маску, накладываешь одно на другое, получаешь адреса сети. Ну или типа того.  
К примеру :
Цитата

debian:/home/oleg# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:18:F3:CE:BE:3B
          inet addr:192.168.111.2  Bcast:192.168.111.255  Mask:255.255.255.0
          inet6 addr: fe80::218:f3ff:fece:be3b/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

Здесь компы сети - от 192.168.111.1 до 192.168.111.254
Каждый можно, в принципе, пингануть. Я бы сделал тупо коннектом к какому-нибудь "стандартному" порту. (nmap в руки). В данном случае по коду возврата connect (2) можно определить есть хост или нету.

Второй вариант - широковещательная UDP на порт, к примеру 7 (echo) (хотя  он может и не работать).
Т.е. включаем бкаст на UDP  сокет и отправляем UDP по адресу (в означенном случае 192.168.111.255 (bcast) )ну и ждем ответа.

Третий вариант. Самый тупой - поставить smbclient и делать
$ nmblookup "*"
- можно получить сразу все  IP сети...  Вообще ещё вариантов - дофига smile Если не один означенный не подойдет, придумаем новый smile

Автор: Graf Zeppelin 18.5.2008, 15:52
Широковещательный можешь взять. Для IPv4 - 255.255.255.255

Автор: MAKCim 18.5.2008, 16:14
GrayCardinal, 
Цитата(GrayCardinal @  18.5.2008,  15:52 Найти цитируемый пост)
Каждый можно, в принципе, пингануть. Я бы сделал тупо коннектом к какому-нибудь "стандартному" порту. (nmap в руки). В данном случае по коду возврата connect (2) можно определить есть хост или нету.

Второй вариант - широковещательная UDP на порт, к примеру 7 (echo) (хотя  он может и не работать).
Т.е. включаем бкаст на UDP  сокет и отправляем UDP по адресу (в означенном случае 192.168.111.255 (bcast) )ну и ждем ответа.

Третий вариант. Самый тупой - поставить smbclient и делать
$ nmblookup "*"

все это плохо
лучший вариант
ICMP echo requests + raw sockets + ioctl() для определения адреса сети  smile 

Автор: Игорь007 18.5.2008, 16:19
GrayCardinal, спасибо большое, буду пробовать (вариант с ifconfig eth0 по-моему оптимальный).
А есть какой-нибудь небольшой мануал по работе в Си с ping'ом?

Автор: MAKCim 18.5.2008, 16:27
Цитата(Игорь007 @  18.5.2008,  16:19 Найти цитируемый пост)
вариант с ifconfig eth0 по-моему оптимальный

ото плохо, т. к всегда есть вероятность, что ifconfig в системе отсутствует
стандартный и переносимый вариант - это использование ioctl() + SIOCGIFCONF
Цитата(Игорь007 @  18.5.2008,  16:19 Найти цитируемый пост)
А есть какой-нибудь небольшой мануал по работе в Си с ping'ом? 

man ping
man 3 system

Автор: GrayCardinal 18.5.2008, 16:41
Цитата

ICMP echo requests + raw sockets + ioctl() для определения адреса сети  

Ты думаешь ему дадут рута ? Ы LOL

Автор: MAKCim 18.5.2008, 16:50
Цитата(GrayCardinal @  18.5.2008,  16:41 Найти цитируемый пост)
Ты думаешь ему дадут рута ? Ы LOL 

извини, но ping тоже от рута работает  smile 
эта классическая задача на использование ICMP
все остальные варианты не стопроцентные


Игорь007, 
если трахаться не хочешь, то
Код

#define REGEXP "Bcast"

char buffer[256];
...
char * interface;
...
sprintf(buffer, "ping -b `ifconfig %s | grep \"%s\" | cut -d ':' -f 3 | cut -d ' ' -f 1`", interface, REGEXP);
system(buffer);

 smile 

Автор: Игорь007 18.5.2008, 17:43
MAKCim, и тебе спасибо.
Цитата

ото плохо, т. к всегда есть вероятность, что ifconfig в системе отсутствует
 
Там, где буду сдавать, он есть. 
С С++ пока дел не имел, поэтому буду трахаться=) За код сенкс, в крайнем случае им воспользуюсь.

Автор: GrayCardinal 18.5.2008, 18:26
MAKCim, 
У пинга сюид рут стоит.

Автор: Игорь007 18.5.2008, 21:39
Прогресс небольшой есть.
Теперь проблема - как взять результаты пинга? system(ping ...) выдаёт нулевое значение.

Автор: MAKCim 19.5.2008, 08:57
Цитата(GrayCardinal @  18.5.2008,  18:26 Найти цитируемый пост)
У пинга сюид рут стоит. 

и что?  smile 
кстати, для создания raw-сокетов рут не обязателен
достаточно CAP_NET_RAW

Добавлено через 3 минуты и 49 секунд
Цитата(Игорь007 @  18.5.2008,  21:39 Найти цитируемый пост)
Теперь проблема - как взять результаты пинга? system(ping ...) выдаёт нулевое значение. 

Код

#define REGEXP "Bcast"
char buffer[1024];
...
char * interface;
...
sprintf(buffer, "ping -b `ifconfig %s | grep \"%s\" | cut -d ':' -f 3 | cut -d ' ' -f 1`", interface, REGEXP);
FILE * fs = popen(buffer, "r");
while (fgets(buffer, 1024, fs) > 0)
    puts(buffer);
pclose(fs);

Автор: GrayCardinal 19.5.2008, 11:05
MAKCim, 
А то что не получится у него рав сокеты использовать  smile

Игорь007, 
Заюзай popen(3). С него читаешь первые две строчки пинга.
$ ping -c 1 <IP>
Там и ttl и время smile

Автор: MAKCim 19.5.2008, 11:12
Цитата(GrayCardinal @  19.5.2008,  11:05 Найти цитируемый пост)
А то что не получится у него рав сокеты использовать

если уж так рута жалко, то тогда только ping  smile 
но это неправильно...

Автор: GrayCardinal 19.5.2008, 11:14
MAKCim, 
Хочу заметить что был предложен не один вариант, который с пингом smile 

Автор: MAKCim 19.5.2008, 11:48
Цитата(GrayCardinal @  19.5.2008,  11:14 Найти цитируемый пост)
Хочу заметить что был предложен не один вариант, который с пингом

а все остальные не стопроцентные
хост может быть подключен к сети, но при этом не иметь запущенных серверов (в т. ч netBIOS)

Автор: GrayCardinal 19.5.2008, 18:23
MAKCim, 
О чём спорим ?

Автор: MAKCim 19.5.2008, 18:58
Цитата(GrayCardinal @  19.5.2008,  18:23 Найти цитируемый пост)
О чём спорим ? 

о путях решения задачи и о том, какие из них применять  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)