Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > C++ Builder
Перезагрузить страницу Как можно узнать все ІР адресса в локальной сети
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
mefest mefest вне форума
Member
 
Сообщений: 21
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.11.2004
По умолчанию Как можно узнать все ІР адресса в локальной сети - 21.12.2004, 12:55

Код:
/*Как мона узнать все ІР адресса в локальной сети которые используют определенный порт?*/
/*Я сделал так но ето как мне кажетса по рагульски какие есть способы?*/
AnsiString p=out /*Мой IP*/,p1="",p2="",p3="";
p1=p.SubString(0,p.Pos(".")-1);
p=p.SubString(p.Pos(".")+1,p.Length());
p2=p.SubString(0,p.Pos(".")-1);
p=p.SubString(p.Pos(".")+1,p.Length());
p3=p.SubString(0,p.Pos(".")-1);
p=p.SubString(p.Pos(".")+1,p.Length());
ListBox1->Clear();
for(int j=0;j<=StrToInt(p3)+1;j++)
 for(int i=0;i<300;i++)
 {
   try
   {
    ClientSocket1->Host=p1+"."+p2+"."+IntToStr(j)+"."+IntToStr(i);
    ClientSocket1->Open();
    ClientSocket1->Socket->SendText("");
    ListBox1->Items->Add(ClientSocket1->Host);
    ClientSocket->Close();
   }
    catch(ESocketError &E)
     {}
 }
Ответить с цитированием
  (#2 (permalink)) Старый
tusha tusha вне форума
Member
 
Сообщений: 70
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.10.2004
По умолчанию 23.12.2004, 20:01

есть такая задача:
необходимо определить все группы в сети, вывести их ай пи адреса.
подскажите какие компоненты использовать, вообще общюу идею программы - т.е. взаимосвязь компонентов, какие классы следует использовать.
или хотябы скажите где можно об этом найти толковую информацию
заранее благодарен
Ответить с цитированием
  (#3 (permalink)) Старый
mefest mefest вне форума
Member
 
Сообщений: 21
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.11.2004
По умолчанию 24.12.2004, 00:26

Код:
void __fastcall TForm1::Refresh1Click(TObject *Sender)
{
 AnsiString p=out,p1="",p2="",p3="";
 p1=p.SubString(0,p.Pos(".")-1);
 p=p.SubString(p.Pos(".")+1,p.Length());
 p2=p.SubString(0,p.Pos(".")-1);
 p=p.SubString(p.Pos(".")+1,p.Length());
 p3=p.SubString(0,p.Pos(".")-1);
 p=p.SubString(p.Pos(".")+1,p.Length());
 ListBox1->Clear();
 ICMP->ReceiveTimeout = 1000;
for(int i=0;i<300;i++)
   {
        try
          {
               ICMP->Host = p1+"."+p2+"."+p3+"."+IntToStr(i);
               ICMP->Ping();
               ListBox1->Items->Add(ICMP->Host);
          }
        catch(...)
          {}
   }
ShowMessage("Обновление окончено");
}
Вот так я думаю будет правильней
Но серавно тупо
А примеря нашел в Examples

Но кто знает в чем прикол
Почему у меня нет локальной сети
и мне выводит
от 127.0.0.1
до 127.0.0.255
Ответить с цитированием
  (#4 (permalink)) Старый
Leon Leon вне форума
Member
 
Сообщений: 262
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.10.2002
По умолчанию 27.12.2004, 09:23

В 6 билдере на вкладке IndyMisc есть компонент IdIPWatch. А лучше получи сначала список машин из сети c помощью NetServerEnum() (описание в MSDN и в форуме тема уже обсуждалась) и от него уже пляши.
Ответить с цитированием
  (#5 (permalink)) Старый
tusha tusha вне форума
Member
 
Сообщений: 70
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.10.2004
По умолчанию 15.01.2005, 23:12

Код:
WSADATA wsaData;
WSAStartup(MAKEWORD(1, 1), &wsaData);
char HostName[1024];
DWORD m_HostIP = 0;
LPHOSTENT lphost;
if(!gethostname(HostName, 1024))
{
        if(lphost = gethostbyname(HostName))
        m_HostIP = ((LPIN_ADDR)lphost->h_addr)->s_addr;
}
WSACleanup();
char my_ip_addr[17];
Edit2->Text = AnsiString(lphost->h_name);
strcpy(my_ip_addr,inet_ntoa(*((in_addr*)lphost->h_addr_list[0])));
Edit1->Text = AnsiString(my_ip_addr);

//**************//
получилось чтото вроде этого - определение айпи собственного компа и его имени. есть чтото типа функции, которая определяет рабочую группу(чтото вроду getfamilyname)?
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
tusha tusha вне форума
Member
 
Сообщений: 70
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.10.2004
По умолчанию 15.01.2005, 23:28

Код:
LPSERVER_INFO_101 pBuf = NULL;
LPSERVER_INFO_101 pTmpBuf;
DWORD dwLevel = 101;
DWORD dwPrefMaxLen = -1;
DWORD dwEntriesRead = 0;
DWORD dwTotalEntries = 0;
DWORD dwTotalCount = 0;
DWORD dwServerType = SV_TYPE_SERVER; // all servers
DWORD dwResumeHandle = 0;
NET_API_STATUS nStatus;
LPTSTR pszServerName = NULL;
DWORD i;
nStatus = NetServerEnum(pszServerName,
                           dwLevel,
                           (LPBYTE *) &pBuf,
                           dwPrefMaxLen,
                           &dwEntriesRead,
                           &dwTotalEntries,
                           dwServerType,
                           NULL,
                           &dwResumeHandle);
тупо взял из мсдн - при компиляции выдает - cann't convert char* to wchar_t* - может кто знает - в чем проблема?
Ответить с цитированием
  (#7 (permalink)) Старый
Garik Garik вне форума
Member
 
Сообщений: 6,201
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 07.06.2002
По умолчанию 16.01.2005, 00:49

Почитай про Unicode. Скорее всего у тебя pszServerName объявлен как char *, а проект собирается как юникодный.
Ответить с цитированием
  (#8 (permalink)) Старый
tusha tusha вне форума
Member
 
Сообщений: 70
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.10.2004
По умолчанию 16.01.2005, 13:12

подскажите, что не правильно:
Код:
ListBox1->Items->Clear();
LPSERVER_INFO_101  pServerEnum;
DWORD   dwResult, dwRead, dwTotal;
dwResult = NetServerEnum( NULL, 101,
                         (BYTE**) &pServerEnum,
                          -1, &dwRead, &dwTotal,
                         SV_TYPE_ALL, NULL, 0 );
if ( dwResult == NERR_Success )
{
        for ( DWORD i=0; i<dwRead; i++ )
        ListBox1->Items->Add( AnsiString( (LPCWSTR) pServerEnum[i].sv101_name ) );
}
Edit3->Text = IntToStr(dwRead);
данный кусок кода выводит мой айпи и имя тачки. однако в рабочей группе по крайней мере еще три тачки. параметр dwRead получается равным 1.
еще такой вопрос: как достучатся в другие рабочие группы и определить их айпишники?
Ответить с цитированием
  (#9 (permalink)) Старый
tusha tusha вне форума
Member
 
Сообщений: 70
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.10.2004
По умолчанию 17.01.2005, 01:08

тут в ходе работы еще возникли вопросы:
как видно выше, имена компов в сетке заносятся в структуру pServerEnum при вызове функции NetServerEnum()
после этого пытаюсь по полученным именам тачек узнать их айпишники:
Код:
char my_ip_addr[17];
for ( DWORD i=0; i<dwRead; i++ )
        {
          lphost = gethostbyname((char*)pServerEnum[i].sv101_name);
          strcpy(my_ip_addr,inet_ntoa(*((in_addr*)lphost->h_addr_list[0])));
}
однако возникает ошибка - gethostbyname при работе возращает NULL
помогите разобраться
а то в мсдн ковырялся - там походу вообще не советуют применять gethostbyname - вместо этого использовать getaddrinfo, тока вся трабла в том, что не могу додуплить как эта функция работает.
заранее всем БАЛЬШОЕ спасибо
Ответить с цитированием
  (#10 (permalink)) Старый
Olesya Olesya вне форума
Member
 
Сообщений: 1,485
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 11.06.2002
По умолчанию 18.01.2005, 00:04

А pServerEnum[i].sv101_name чему равно?
Ответить с цитированием
  (#11 (permalink)) Старый
tusha tusha вне форума
Member
 
Сообщений: 70
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.10.2004
По умолчанию 18.01.2005, 00:28

вродебы раздуплился(тока по большому счету не знаю насколько это коряво , но работает)
Код:
          AnsiString ServName =(AnsiString)pServerEnum[i].sv101_name;
          lphost = gethostbyname(ServName.c_str());
[/quote]
Ответить с цитированием
  (#12 (permalink)) Старый
tusha tusha вне форума
Member
 
Сообщений: 70
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 10.10.2004
По умолчанию 21.01.2005, 02:26

подскажите мне тупому в чем может быть проблема.
есть объект TStringList *USER_LIST; в него загоняются все имена тачек которые есть в сети. после этого идет следующий код:
Код:
        LPWKSTA_USER_INFO_0 pBuf = NULL;
        LPWKSTA_USER_INFO_0 pTmpBuf;
        DWORD dwLevel = 0;
        DWORD dwPrefMaxLen = -1;
        DWORD dwEntriesRead = 0;
        DWORD dwTotalEntries = 0;
        DWORD dwResumeHandle = 0;
        DWORD i;
        DWORD dwTotalCount = 0;
        NET_API_STATUS nStatus;
for (int i=0;i<USER_LIST->Count;i++) //цикл от 0 до кол-ва записей
        {
        wchar_t *pszServerName;
        StringToWideChar(USER_LIST->Strings[i], pszServerName, 20);
// получение длинной строки
        nStatus = NetWkstaUserEnum(pszServerName,
                dwLevel,
                (LPBYTE*)&pBuf,
                dwPrefMaxLen,
                &dwEntriesRead,
                &dwTotalEntries,
                &dwResumeHandle); // функция которая сканирует всех юзверей в сети
        if ((nStatus == NERR_Success) || (nStatus == ERROR_MORE_DATA))
        {
                if ((pTmpBuf = pBuf) != NULL)
                {
                        for (i = 0; (i < dwEntriesRead); i++)
                        {
                                if (pTmpBuf == NULL)
                                {
                                        USER_NAME = "Unknown user name";
                                        break;
                                }
                                USER_NAME = pTmpBuf->wkui0_username;
                                pTmpBuf++;
                                dwTotalCount++;
                        }
                }
        }
        }
трабла в том , что он доходит до строки StringToWideChar() и потом выкидывает и сообщением что произошла ошибка в кернел32.длл
Заренее благодарен за помощь
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
VaRela VaRela вне форума
Новичок
 
Сообщений: 14
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.02.2005
По умолчанию 16.02.2005, 15:51

Искренне не понял в чем смысл вопроса. Нужно перебрать диапазон IPшников своей подсети?
Ответить с цитированием
  (#14 (permalink)) Старый
VaRela VaRela вне форума
Новичок
 
Сообщений: 14
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.02.2005
По умолчанию 16.02.2005, 15:51

Искренне не понял в чем смысл вопроса. Нужно перебрать диапазон IPшников своей подсети?
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
подключение по локальной сети NERO_1 Любые вопросы от новичков 2 11.03.2012 11:19
установка локальной сети Елена-пена Любые вопросы от новичков 4 09.06.2011 15:42
Инет по локальной сети! snit2007 Сетевые подключения 3 10.11.2008 02:50
Можно ли установить Windows XP по локальной сети? Krit Любые вопросы от новичков 1 18.09.2008 18:20
настройка локальной сети b_seryi Wi-Fi и сети 7 13.09.2008 21:50
Можно ли узнать кто из пользователей сети удалил документы? Kupuлл Любые вопросы от новичков 1 04.07.2008 07:38
Инет в локальной сети. Pasha-new Сетевые подключения 2 31.08.2007 10:58
Подключение по локальной сети alls Сетевые подключения 20 07.06.2007 14:41
Доступ в локальной сети vitem Сетевые подключения 1 06.05.2007 09:28
Как навредить в локальной сети Anonymous Вопросы начинающих программистов 11 15.06.2004 13:32
Можно ли узнать имя компьютера в локальной сети? MJ DHTML, JavaScript, VBScript 6 14.08.2003 12:29



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов