C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
вопрос по сети., обнаружение в сети компа
grebenyk
Отправлено: 30.11.2006, 11:44


Дежурный стрелочник

Группа: Участник
Сообщений: 73



как имея название компа узнать его присутствие в сети и не зная ни одного названия компа высветить весь список. Я не знаю может что то подобное ping зделать надо. Кто пробовал что-то подобное помогите?
AVC
Отправлено: 30.11.2006, 12:55


Ветеран

Группа: Модератор
Сообщений: 1583



1. ping, если он разрешен и поддерживается tcp.
2. широковещательный udp или EnumResourses
grebenyk
Отправлено: 30.11.2006, 14:26


Дежурный стрелочник

Группа: Участник
Сообщений: 73



а подробней, как этим воспользоваться, через чего.
AVC
Отправлено: 30.11.2006, 15:27


Ветеран

Группа: Модератор
Сообщений: 1583



По поводу широковещательного udp поищите на форуме.

Пинг и EnumResource могу привести если нужно.
Для пинга надо знать или имя или IP адрес.
А EnumResource перечисляет, как мне помнится, расшаренные ресурсы. Хотя windows машины, кажется, покажет все.
grebenyk
Отправлено: 30.11.2006, 16:18


Дежурный стрелочник

Группа: Участник
Сообщений: 73



ну хорошо, как хоть пропинговать. А в отношении видно всех, не всегда, иногда надо воспользоваться "поиском компьютера", чтоб он в списке появился. И как же их увидеть , может есть компонента какая
Doga
Отправлено: 30.11.2006, 16:45


Мастер участка

Группа: Участник
Сообщений: 575



Я не так давно выкладывал примерчик — VTVDemo, так вот он может просканировать сеть на предмет наличия подключённых к ней компов, а так же их расшаренных ресурсов...

Работает через IShellFolder. Возьмите из исходников чтоВам нужно и пользуйтесь biggrin.gif
AVC
Отправлено: 30.11.2006, 16:59


Ветеран

Группа: Модератор
Сообщений: 1583



А для чего нужно-то? Если для работы то может воспользоваться профессиональным сетевым сканером? Благо их в ИНете валяется много. И платных, и ломаных и бесплатных.

Ну ладно, пропинговать (обычно одна из первых процедур сканера):
CODE

HANDLE  AxS_hIcmp = NULL;
HANDLE (WINAPI *pIcmpCreateFile) (VOID);
BOOL (WINAPI *pIcmpCloseHandle) (HANDLE);
DWORD (WINAPI *pIcmpSendEcho)  (HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD);
if (!AxS_hIcmp)
{ // Для Ping'а нужна библиотека icmp.dll
AxS_hIcmp = LoadLibrary("ICMP.DLL");

pIcmpCreateFile  = (HANDLE (WINAPI *)(void))  GetProcAddress(AxS_hIcmp,"IcmpCreateFile");
pIcmpCloseHandle = (BOOL (WINAPI *) (HANDLE)) GetProcAddress(AxS_hIcmp,"IcmpCloseHandle");

pIcmpSendEcho  = (DWORD (WINAPI *) (HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD))
  GetProcAddress(AxS_hIcmp,"IcmpSendEcho");


AnsiString str = "";
if (pIcmpCreateFile  == NULL) str += "Проблемы с импортом функции IcmpCreateFile\n";
if (pIcmpCloseHandle == NULL) str += "Проблемы с импортом функции pIcmpCloseHandle\n";
if (pIcmpSendEcho  == NULL) str += "Проблемы с импортом функции pIcmpSendEcho";

if (!str.IsEmpty())
 { FreeLibrary(AxS_hIcmp); // отсоединение icmp
 AxS_hIcmp = NULL;
 throw Exception(str);
 }
} // !AxS_hIcmp




//---------------------------------------------------------------------------
//              Проверка связи ping'ом
//---------------------------------------------------------------------------

PACKAGE bool __fastcall AxS_Probe_Ping (const AnsiString &pINet_Adr, int pWaitMS, double *rPingMS)
{
if (rPingMS) *rPingMS = 0;
AnsiString vIP = pINet_Adr.Trim();

if (vIP.IsEmpty()) return false;

if (!IPIsValid(vIP))
{ struct hostent *hret = gethostbyname(vIP.c_str());
if (!hret) vIP = "";
else
 { char *cp = hret->h_addr_list[0];
 vIP = AnsiString(int(*(cp+0) & 0xFF)) + "." +
   AnsiString(int(*(cp+1) & 0xFF)) + "." +
   AnsiString(int(*(cp+2) & 0xFF)) + "." +
   AnsiString(int(*(cp+3) & 0xFF))
  ;
 }
}
if (!IPIsValid(vIP)) return false;

unsigned long inetadr = inet_addr(vIP.c_str());


int   waitMS = pWaitMS;
if (waitMS <     10)  waitMS =     10;
if (waitMS > 100000)  waitMS = 100000;


HANDLE han = pIcmpCreateFile();
if (han == INVALID_HANDLE_VALUE) return false;

// Build ping packet
char pingbuf [32]; memset(pingbuf, 'q',  sizeof(pingbuf));

int    echobuflen = sizeof(ICMPECHO) + sizeof(pingbuf);
char  *echobuf = new char[echobuflen];
ICMPECHO *pecho  = (ICMPECHO*)(echobuf);

pecho->Address = inetadr; // source address
pecho->Status = 0;  // IP status value
pecho->RTTime = 0;  // Round Trip Time in milliseconds
pecho->Reserved = 0;  //
      // Заполняется автоматичиски
pecho->DataSize = 0;  // reply data size  = sizeof(pingbuf);
pecho->Data  = NULL;  // reply data buffer = echobuf + sizeof(ICMPECHO);

        // reply options
pecho->Options.Ttl   = 0;
pecho->Options.Tos   = 0;
pecho->Options.Flags  = 0;
pecho->Options.OptionsSize = 0;
pecho->Options.OptionsData = NULL;

IPINFO vipinfo;
vipinfo.Ttl   = 255;
vipinfo.Tos   = 0;
vipinfo.Flags  = 0;
vipinfo.OptionsSize = 0;
vipinfo.OptionsData = NULL;


__int64 qp_freq, qp_begin, qp_end;
QueryPerformanceFrequency ((LARGE_INTEGER*)&qp_freq);
QueryPerformanceCounter   ((LARGE_INTEGER*)&qp_begin);

// Send the ping packet
DWORD stat = pIcmpSendEcho (han,  inetadr, NULL, 0,
       &vipinfo, echobuf, echobuflen, waitMS );

QueryPerformanceCounter((LARGE_INTEGER*)&qp_end);
if (rPingMS) *rPingMS = (double(qp_end — qp_begin) * double(1000)) / double(qp_freq);

bool ret = true;
if (stat == 0 || pecho->Status != 0) ret = false;


delete[] echobuf;

return ret;
}


Как-то крапал статейку. Прикладываю.

User Attached Image Скачать файл
axsock.rar


grebenyk
Отправлено: 30.11.2006, 17:58


Дежурный стрелочник

Группа: Участник
Сообщений: 73



мне всего лишь надо вносить имена компов , в список(какой хочешь), который введит человек, допустим через Edit и кнопку. А я в этот момент , как нажимается кнопка начинавю проверку компа в сети. А потом сообщаю в случае чего , что такого имени нет или заношу в список
grebenyk
Отправлено: 30.11.2006, 18:00


Дежурный стрелочник

Группа: Участник
Сообщений: 73



признаться честно, я думал Вы мне будете про компонент TCP что-то скажете
AVC
Отправлено: 30.11.2006, 18:48


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (grebenyk @ 30.11.2006, 16:58)
А я в этот момент , как нажимается кнопка начинавю проверку компа в сети. А потом сообщаю в случае чего , что такого имени нет или заношу в список

struct hostent *hret = gethostbyname(введенное_имя.c_str());
if (!hret)...

Но если в данный момент компьбтер не включен или не в сети ....
grebenyk
Отправлено: 01.12.2006, 20:05


Дежурный стрелочник

Группа: Участник
Сообщений: 73



пасибки, в принципе я это понял из вышеизложенного
grebenyk
Отправлено: 01.12.2006, 20:19


Дежурный стрелочник

Группа: Участник
Сообщений: 73



может заодно кто спутник посоветует какой
grebenyk
Отправлено: 01.12.2006, 20:21


Дежурный стрелочник

Группа: Участник
Сообщений: 73



упс , это я с рубрикой промазал, это я в "Компьютерное железо и системное администрирование." задаю вопросик

Вернуться в Вопросы программирования в C++Builder