-
function IPAddrToName(IPAddr: string): string; var S: String; SockAddrIn: TSockAddrIn; HostEnt: PHostEnt; WSAData: TWSAData;
FSocket:TSocket; //Сокет. addr:TSockAddr; //Структура адреса. begin S := ''; WSAStartup($101, WSAData); SockAddrIn.sin_addr.s_addr := inet_addr(PChar(IPAddr)); HostEnt := gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET); if HostEnt <> nil then begin S := StrPas(HostEnt^.h_name); end else begin if All then begin WSACleanup; addr.sin_family:=AF_INET; //Мутим адресацию, в нашем случае - асинхронная. addr.sin_addr.S_addr:=inet_addr(pchar(IPAddr));//Заполняем поле адреса. if WSAStartup($101,WSAData)<>0 then begin //Если произошла ошибка при старте WinSock выводим сообщение и выходим. ShowMessage('ОШИБКА: при старте WinSock. ' + IntToStr(GetLastError)); exit; end;
FSocket:=socket(AF_INET,SOCK_STREAM,0);//Создаем гнездо. if FSocket=INVALID_SOCKET then begin //Если если ошибка при создании гнезда то... ShowMessage('ОШИБКА: При создании сокета. ' + IntToStr(GetLastError)); exit; end; addr.sin_port:=htons(PortInvisible);//Присваеваем значению порта текущее значение счетчика. index := connect(FSocket,addr,sizeof(addr)); if index = 0 then begin //Ури, открытый порт. S := 'Порт = ' + IntToStr(PortInvisible); end; CloseSocket(FSocket); end; //if Form1.cbInVisible.Checked end; //else Result := S; WSACleanup; end;
procedure TThreadScanNet.Execute; var i,k: Cardinal; s: string; SetM: WORD; ii: integer; Label R; begin try FreeOnTerminate := TRUE; SetLength(Loc, 0); with Form1 do begin for k := iBegAddr to iEndAddr do begin s := IntToStr((k Shr 24) AND $FF) + '.' + IntToStr((k Shr 16) AND $FF) + '.' + IntToStr((k Shr 8) AND $FF) + '.' + IntToStr(k AND $FF);
s1 := IPAddrToName(s); if s1 <> '' then begin j := k; NumAdd := NumAdd + 1; SetLength(Loc, NumAdd); Loc[NumAdd-1].IP := j; Loc[NumAdd-1].Name := s1;
{ SetM := WaitForSingleObject( Scan_Send.Form1.Mutex, INFINITE ); if SetM = WAIT_OBJECT_0 then Scan_Send.Form1.NumPc := Scan_Send.Form1.NumPc + 1; ReleaseMutex( Scan_Send.Form1.Mutex ); }
{ EnterCriticalSection(Form1.StringSection); //Ждать освобождения Крит Scan_Send.ExZapisNetAddres[Num].NumAdd := Scan_Send.ExZapisNetAddres[Num].NumAdd + 1; // Synchronize(ChDate); LeaveCriticalSection(Form1.StringSection); }
end; end; //for j := iBegAddr to iEndAddr do end; //with Form1 do finally end;
// EnterCriticalSection(Form1.StringSection); //Ждать освобождения Крит
R: SetM := WaitForSingleObject( Scan_Send.Form1.Mutex, INFINITE ); if SetM = WAIT_OBJECT_0 // if WaitForSingleObject( Scan_Send.Form1.Mutex, 2000 ) = WAIT_OBJECT_0 then begin SetLength(Scan_Send.ExZapisNetAddres[Num].Lisp,NumAdd) ; Scan_Send.ExZapisNetAddres[Num].NumAdd := NumAdd; for ii := 0 to NumAdd - 1 do begin Scan_Send.ExZapisNetAddres[Num].Lisp[ii].AddNet := Loc[ii].IP; Scan_Send.ExZapisNetAddres[Num].Lisp[ii].AddName := Loc[ii].Name; end; Scan_Send.ExZapisNetAddres[Num].Nit := FALSE; Scan_send.NumEndThread := Scan_send.NumEndThread + 1;
ReleaseMutex( Scan_Send.Form1.Mutex );
end else begin // ReleaseMutex( Scan_Send.Form1.Mutex ); Sleep(0); goto R; end;
// ReleaseMutex( Scan_Send.Form1.Mutex );
{ ReleaseMutex( Scan_Send.Form1.Mutex );
sleep(500); } // Scan_Send.ExZapisNetAddres[Num].ThreadScanNet := TRUE; // LeaveCriticalSection(Form1.StringSection); //Освободить Крит end;
-
Какой ужас ..
Мало того, что IPAddrToName занимается не тем чем ей положено согласно названию, да еще и бред какой-то:
> Мутим адресацию, в нашем случае - асинхронная
-
Я понимаю, но в данном случае эта часть кода не используется, хотя когда эта программа работала без динамического массива, а результат выводился в файл она нисколько не мешала, да и сейчас при работе отключается через if All Мешать она никак не может.
-
> в данном случае эта часть кода не используется
Какая такая "часть кода" не используется ? Зачем ты приводишь код, который не используется ? Меня он абсолютно не интересует. Приводи только актуальный код, без отсебячины и чьих-то бредовых комментарием про "муть".
-
function IPAddrToName(IPAddr: string): string; var S: String; SockAddrIn: TSockAddrIn; HostEnt: PHostEnt; WSAData: TWSAData;
FSocket:TSocket; //Сокет. addr:TSockAddr; //Структура адреса. begin S := ''; WSAStartup($101, WSAData); SockAddrIn.sin_addr.s_addr := inet_addr(PChar(IPAddr)); HostEnt := gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET); if HostEnt <> nil then begin S := StrPas(HostEnt^.h_name); End; Result := S; WSACleanup; end;
-
так. И что конкретно ты ожидаешь от этой функции ? Опиши как ты себе понимаешь ее работу ..
-
struct hostent { char FAR * h_name; // имя хоста char FAR * FAR * h_aliases; // дополнительные названия short h_addrtype; // тип адреса short h_length; // длинна каждого адреса в байтах char FAR * FAR * h_addr_list; // список адресов };
Мне нужно имя хоста, если есть имя, значит есть и хост. Я понимаю, что структуру можно и не получить даже если хост физически работает.
-
> Мне нужно имя хоста
У хоста может не быть имени, от этого он хостом быть не перестанет.
> если есть имя, значит есть и хост
Нет. Если есть имя, значит есть адрес хоста, а не хост.
Во-первых, ф-ции gethostbyaddr() нет никакого дела до того, присутствует ли хост в сети в момент ее вызова. Она к интересующему хосту не обращается вообще.
Во-вторых, ф-ция gethostbyaddr() позиционируется в Майкрософт как устаревшая, вместо нее настоятельно рекомендуется использовать протоколонезависимую ф-цию getnameinfo(), хотя суть использования новой или старой функции неизменна.
Так что до синхронизации тебе еще как до Китая - ты в принципе не понимаешь что творишь и как это в действительности работает.
-
Спасибо, буду разбираться. С уважением, В
-
Простая ассоциация для наведения порядка в голове: Наличие у тебя или кого-либо в адресной книге (читай - база данных DNS) в мобильном телефоне записи "Имя: Вася Пупкин (читай - HostName), Телефон: 123456789 (читай - HostAddress)" не означает:
- что Вася Пупкин жив; - что у него есть телефон; - что в телефоне установлена симка именно на номер 123456789; - что владелец телефона и симки в дан.момент именно Вася Пупкин; - что телефон этот включен; - что на этот телефон можно позвонить и дозвониться; - что ответит именно Вася Пупкин и никто иной.
-
И еще: за массированное сканирование хостов и сервисов можно и по шее получить от провайдера)
-
Хорошо, я понял что запрос идёт на DNS. Пусть в этом вотросе я полный ноль. Согласен, это действительно не далеко от истины.
Но, почему при разном сисле потоков получаю разное число хостов, хотя запускаются одновременнодве программы, и таблица хостов на DNS не должна так быстро меняться? Кроме того, повторное сканирование с малым числом потоков 512 точно повторяет предыдущий результат? Я понимаю если бы результат сканирования 512 и 1792 потока отличался на единицы, но речь идёт о разах. 3-4 раза Даже если опрос по этой функции даёт полный бред, то почему в одном случае этот бред повторяется с точностью до хоста, а во втором случае нет. Почему при сканировании локалки, в которой я живу, она точно называет имена и адреса рабочих станций и серверов?
Я не специалист по сетям, и занимаюсь этим, чтобы не отупеть полностью, и не потерять навыки, поскольку решение систем трансцедентных и дифуравнений, при проектировании физических установок в нашей стране уже давно никого не интересут.
-
> Почему при сканировании
Да нет у тебя никакого сканирования, что ты заладил про сканирование ?)
> локалки, в которой я живу, она точно называет имена и адреса > рабочих станций и серверов
Потому что эта инф-ция имеется и доступна в тех DNS-базах, к которым ты осуществляешь обращение при своем т.н. "сканировании".
А рассуждать о какой-то синхронизации сейчас попросту бессмысленно - нет достоверной инф-ции, которую требуется синхронно заносить в аккумулирующий ресурс.
Рекомендую в целях отладки мультипоточного синхронного взаимодействия реализовать эмулятор, который бы не лез в сеть, а возвращал бы данные о хостах из заранее подготовленной локальной таблицы.
-
> не специалист по сетям
Придется в той или иной минимум необходимой мере им стать, если ты действительно желаешь осознать происходящее. И это, скажем, не самое худшее лекарство от отупения)
-
> > Придется в той или иной минимум необходимой мере им стать, > если ты действительно желаешь осознать происходящее. > И это, скажем, не самое худшее лекарство от отупения) > <Цитата>
Соглосен на все сто.
Удачи Вам! В
-
Точнее, сканирование-то есть, но сканируешь ты вовсе не то, что заявил в топикстарте: ты просто тупо шаришь по записям доступных тебе DNS-рерурсов.
-
Ключевой момент, могущий пролить свет на тайну: сетевые DNS-сервисы работают под управлением транспортного протокола UDP, который не гарантирует доставку инф.сообщений от источника к приемнику. И чем "дальше" от твоего хоста находится хост, предоставляющий DNS-сервис, тем меньше вероятность достоверности получаемых при DNS-запросах данных.
-
Да, я читал об UDP и других протоколах, назначение их тоже для меня более или менее ясно, Олифера прочитал и общая картина сети понятна, но теория без практики пустое место, пока своими руками что-то не сделаешь, нечего и говорить о том, что знаешь. Телефонный справочник может быть и интересное чтиво, особенно на ночь, но если нет телефона или некуда звонить... То же и с сетями, надо пробовать и порверять. Но потоки всё-таки, можно рассматривать и без глубокого понимания работы сети, мне почему-то так кажется... Но может быть я не прав.
-
> потоки всё-таки, можно рассматривать и без глубокого понимания > работы сети, мне почему-то так кажется
Правильно кажется. Более того, на этом этапе их следовало бы рассматривать в полном отрыве от сетевой логики. Т.е. мухи отдельно (потоки, синхронизация и т.д. и т.п.), а котлеты отдельно (сети, протоколы и т.д. и т.п). И уж только тогда следует сажать мух на котлеты, когда мухи станут большими-злыми-зелеными-осенними, а котлеты будут хорошо прожарены)
О чем я тебе и сказал в [32] (про эмулятор)
-
Понял.
До свидания. Разберусь с сетями вернусь. Конец связи. В
|