Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.01.2014, 20:11   #1
assch
Пользователь
 
Регистрация: 13.09.2010
Сообщений: 65
По умолчанию Список устойств в домашней сети

С помощью какой функции или связки функций можно получить список устройств которые на
данный момент времени присутствуют в твоей (домашней) сети

Может быть я не правильно ставлю вопрос но под устройствами я имею ввиду
например телевизор (с DLNA примочкой) который в данный момент времени включен
и ждёт когда с ним будет работать медиасервер установленный на компьютере

Информация об устройстве типа - (Название, Ip-адрес, MAC-адрес, Тип устойства)
Эту иформацию конечно можно посмотреть и в самом медиасервере если например нажать
там на опцию поиска устройств и он выдаст список клиентов

Вопрос как програмно он это делает
Если кто в теме подскажите пожалуйста
assch вне форума Ответить с цитированием
Старый 13.01.2014, 20:50   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

По-моему это не возможно, если устройство не поддерживает определенный протокол. Так то и тупо в винде можно увидеть девайсы по сети, если они в ethernet могут выходить.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.01.2014, 21:49   #3
assch
Пользователь
 
Регистрация: 13.09.2010
Сообщений: 65
По умолчанию

Устройство конечно же поддерживает этот протокол
assch вне форума Ответить с цитированием
Старый 13.01.2014, 22:01   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

SNMP
http://ru.wikipedia.org/wiki/SNMP
http://habrahabr.ru/company/zabbix/blog/203050/
http://habrahabr.ru/post/196308/
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 14.01.2014, 14:48   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

странно, попробовал парой менагеров, в сети не видит ни одного устройства с этим протоколом
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.01.2014, 15:10   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Мне кажется здесь нужен http://en.wikipedia.org/wiki/Universal_Plug_and_Play
waleri вне форума Ответить с цитированием
Старый 15.01.2014, 12:32   #7
assch
Пользователь
 
Регистрация: 13.09.2010
Сообщений: 65
По умолчанию

Функция SendARP() дала небольшие результаты.
Она по айпи адресу может выдать его мак адрес.
Я сделал функцию которая как бы просматривает локальную сеть на предмет
подключённых устойств. В принципи эту функцию можно расматривать как первый
шаг в развёрнутой мною теме.

Алгоритм функции:

В цикле идёт подстановка айпи адресов (256 циклов)
начиная с адреса - 192.168.0.0 до 192.168.0.255
и соответственно если нет ошибки то это задействованный на данный
момент времени айпи адрес в сети и функция находит мак адрес к нему.
Поиск идёт медленно примерно секунда цикл.

Код C++

Код:
#undef UNICODE

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>

#include <iostream>
using namespace std;

#pragma comment(lib, "iphlpapi.lib") // Функция - SendARP
#pragma comment(lib, "ws2_32.lib")   // Функции - inet_addr , inet_ntoa

int main (void)
{
    DWORD dwRetVal;
    IPAddr DestIp;
    IPAddr SrcIp = 0;
    ULONG MacAddr[3];
    ULONG PhysAddrLen;
    BYTE *bPhysAddr;
    int dwCol = 0;
    int dwAdr;
    unsigned int i;
    unsigned int p;
    struct sockaddr_in addr;

DestIp = inet_addr("192.168.0.0");
dwAdr = 50;

for (p = 0; p < dwAdr; p++)
{
   addr.sin_addr.s_addr = DestIp;
   printf("%s \t", inet_ntoa(addr.sin_addr));
   PhysAddrLen = 6;
   dwRetVal = SendARP(DestIp, SrcIp, &MacAddr, &PhysAddrLen);

if (dwRetVal == NO_ERROR)
{
    dwCol++;
    bPhysAddr = (BYTE *) & MacAddr;
      if (PhysAddrLen)
      {
         for (i = 0; i < (int) PhysAddrLen; i++)
            {
               if (i == (PhysAddrLen - 1))
               printf("%.2X\n", (int) bPhysAddr[i]);
               else
               printf("%.2X-", (int) bPhysAddr[i]);
            }
       }
}
else
{
printf("\n");
}
DestIp += 16777216;
}

//===========================================================
char pTxt[100];
char pCol[100];
wsprintf(pCol,"%u",dwCol);
lstrcpy(pTxt,"Количество найденных адресов   -   ");
lstrcat(pTxt,pCol);
lstrcat(pTxt,"       ");
MessageBox(0,pTxt," ",32);
//===========================================================

//cin.get();
return 0;
}
В примере поиск идёт 50 циклов (переменная - dwAdr = 50)
до адреса - 192.168.0.50
Такой алгоритм для поиска конечно очень медленный
да и к тому же тип и название ресурса я пока тоже не знаю как определить.

Может кто знает как можно побыстрее сделать поиск?
и название ресурса с типом как ещё можно определить?
Вложения
Тип файла: rar 1.rar (3.4 Кб, 29 просмотров)
assch вне форума Ответить с цитированием
Старый 15.01.2014, 13:57   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от assch Посмотреть сообщение
Может кто знает как можно побыстрее сделать поиск?
многопоточность.
и название ресурса с типом как ещё можно определить?[/QUOTE]http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
попробуйте
Цитата:
Сообщение от assch Посмотреть сообщение
В цикле идёт подстановка айпи адресов (256 циклов)
начиная с адреса - 192.168.0.0 до 192.168.0.255
по хорошему нужно определять маску сети(и ip) и сканировать лишь свою подсеть и именно её.
у меня к примеру домашняя подсеть 192.168.3.* .
но если программа строго для себя то все ок.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.01.2014, 14:01   #9
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

...пинг не вариант, устройство может и не отвечать на ICMP запросы.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 15.01.2014, 14:01   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

В сети 192.168.* - 65536 потенциальных узлов.
В сети 10.* их еще больше (16777216, если быть точными).
http://en.wikipedia.org/wiki/Universal_Plug_and_Play пробовали?
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Грид в домашней сети Altera Свободное общение 11 06.02.2011 15:18
список программ по сети Alekcey Работа с сетью в Delphi 11 16.07.2010 10:29
TserverSocket в домашней сети (Delphi 2009) dyonysos Помощь студентам 1 19.09.2009 18:39