Конференция "Сети" » Проблема с потоками сканирования [WinXP]
 
  • bvv (18.09.09 10:41) [20]
    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;
  • Сергей М. © (18.09.09 10:57) [21]
    Какой ужас ..

    Мало того, что IPAddrToName занимается не тем чем ей положено согласно названию, да еще и бред какой-то:


    > Мутим адресацию, в нашем случае - асинхронная
  • bvv (18.09.09 11:10) [22]
    Я понимаю, но в данном случае эта часть кода не используется, хотя когда эта программа работала без динамического массива, а результат выводился в файл она нисколько не мешала, да и сейчас при работе отключается через  if All
    Мешать она никак не может.
  • Сергей М. © (18.09.09 11:16) [23]

    > в данном случае эта часть кода не используется


    Какая такая "часть кода" не используется ?
    Зачем ты приводишь код, который не используется ?
    Меня он абсолютно не интересует.
    Приводи только актуальный код, без отсебячины и чьих-то бредовых комментарием про "муть".
  • bvv (18.09.09 11:21) [24]
    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;
  • Сергей М. © (18.09.09 11:28) [25]
    так.
    И что конкретно ты ожидаешь от этой функции ?
    Опиши как ты себе понимаешь ее работу ..
  • bvv (18.09.09 11:42) [26]
    struct hostent
    {
    char FAR * h_name;   // имя хоста
    char FAR * FAR * h_aliases;  // дополнительные названия
    short h_addrtype;   // тип адреса
    short h_length;   // длинна каждого адреса в байтах
    char FAR * FAR * h_addr_list; // список адресов
    };

    Мне нужно имя хоста, если есть имя, значит есть и хост.
    Я понимаю, что структуру можно и не получить даже если хост физически работает.
  • Сергей М. © (18.09.09 11:59) [27]

    > Мне нужно имя хоста


    У хоста может не быть имени, от этого он хостом быть не перестанет.


    > если есть имя, значит есть и хост


    Нет.
    Если есть имя, значит есть адрес хоста, а не хост.

    Во-первых, ф-ции gethostbyaddr() нет никакого дела до того, присутствует ли хост в сети в момент ее вызова. Она к интересующему хосту не обращается вообще.

    Во-вторых, ф-ция gethostbyaddr() позиционируется в Майкрософт как устаревшая, вместо нее настоятельно рекомендуется использовать протоколонезависимую ф-цию getnameinfo(), хотя суть использования новой или старой функции неизменна.

    Так что до синхронизации тебе еще как до Китая - ты в принципе не понимаешь что творишь и как это в действительности работает.
  • bvv (18.09.09 12:04) [28]
    Спасибо, буду разбираться.
    С уважением, В
  • Сергей М. © (18.09.09 12:18) [29]
    Простая ассоциация для наведения порядка в голове:
    Наличие у тебя или кого-либо в адресной книге (читай - база данных DNS) в мобильном телефоне записи
    "Имя: Вася Пупкин (читай - HostName), Телефон: 123456789 (читай - HostAddress)"
    не означает:

    - что Вася Пупкин жив;
    - что у него есть телефон;
    - что в телефоне установлена симка именно на номер 123456789;
    - что владелец телефона и симки в дан.момент именно Вася Пупкин;
    - что телефон этот включен;
    - что на этот телефон можно позвонить и дозвониться;
    - что ответит именно Вася Пупкин и никто иной.
  • Сергей М. © (18.09.09 12:30) [30]
    И еще: за массированное сканирование хостов и сервисов можно и по шее получить от провайдера)
  • bvv (18.09.09 12:37) [31]
    Хорошо, я понял что запрос идёт на DNS.
    Пусть в этом вотросе я полный ноль.
    Согласен, это действительно не далеко от истины.

    Но, почему при разном сисле потоков получаю разное число хостов, хотя запускаются одновременнодве программы, и таблица хостов на DNS не должна так быстро меняться?
    Кроме того, повторное сканирование с малым числом потоков 512 точно повторяет предыдущий результат?
    Я понимаю если бы результат сканирования 512 и 1792 потока отличался на единицы, но речь идёт о разах. 3-4 раза
    Даже если опрос по этой функции даёт полный бред, то почему в одном случае этот бред повторяется с точностью до хоста, а во втором случае нет.
    Почему при сканировании локалки, в которой я живу, она точно называет имена и адреса рабочих станций и серверов?

    Я не специалист по сетям, и занимаюсь этим, чтобы не отупеть полностью, и не потерять навыки, поскольку решение систем трансцедентных и дифуравнений, при проектировании физических установок в нашей стране уже давно никого не интересут.
  • Сергей М. © (18.09.09 12:57) [32]

    > Почему при сканировании


    Да нет у тебя никакого сканирования, что ты заладил про сканирование ?)


    > локалки, в которой я живу, она точно называет имена и адреса
    > рабочих станций и серверов


    Потому что эта инф-ция имеется и доступна в тех DNS-базах, к которым ты осуществляешь обращение при своем т.н. "сканировании".

    А рассуждать о какой-то синхронизации сейчас попросту бессмысленно - нет достоверной инф-ции, которую требуется синхронно заносить в аккумулирующий ресурс.

    Рекомендую в целях отладки мультипоточного синхронного взаимодействия реализовать эмулятор, который бы не лез в сеть, а возвращал бы данные о хостах из заранее подготовленной локальной таблицы.
  • Сергей М. © (18.09.09 13:01) [33]

    > не специалист по сетям


    Придется в той или иной минимум необходимой мере им стать, если ты действительно желаешь осознать происходящее.
    И это, скажем, не самое худшее лекарство от отупения)
  • bvv (18.09.09 13:07) [34]

    >
    > Придется в той или иной минимум необходимой мере им стать,
    >  если ты действительно желаешь осознать происходящее.
    > И это, скажем, не самое худшее лекарство от отупения)
    > <Цитата>


    Соглосен на все сто.

    Удачи Вам!
    В
  • Сергей М. © (18.09.09 13:09) [35]
    Точнее, сканирование-то есть, но сканируешь ты вовсе не то, что заявил в топикстарте: ты просто тупо шаришь по записям доступных тебе DNS-рерурсов.
  • Сергей М. © (18.09.09 13:15) [36]
    Ключевой момент, могущий пролить свет на тайну: сетевые DNS-сервисы работают под управлением транспортного протокола UDP, который не гарантирует доставку инф.сообщений от источника к приемнику.
    И чем "дальше" от твоего хоста находится хост, предоставляющий DNS-сервис, тем меньше вероятность достоверности получаемых при DNS-запросах данных.
  • bvv (18.09.09 13:31) [37]
    Да, я читал об UDP и других протоколах, назначение их тоже для меня более или менее ясно, Олифера прочитал и общая картина сети понятна, но теория без практики пустое место, пока своими руками что-то не сделаешь, нечего и говорить о том, что знаешь. Телефонный справочник может быть и интересное чтиво, особенно на ночь, но если нет телефона или некуда звонить...
    То же и с сетями, надо пробовать и порверять.
    Но потоки всё-таки, можно рассматривать и без глубокого понимания работы сети, мне почему-то так кажется...
    Но может быть я не прав.
  • Сергей М. © (18.09.09 14:01) [38]

    > потоки всё-таки, можно рассматривать и без глубокого понимания
    > работы сети, мне почему-то так кажется


    Правильно кажется.
    Более того, на этом этапе их следовало бы рассматривать в полном отрыве от сетевой логики.
    Т.е. мухи отдельно (потоки, синхронизация и т.д. и т.п.), а котлеты отдельно (сети, протоколы и т.д. и т.п).
    И уж только тогда следует сажать мух на котлеты, когда мухи станут большими-злыми-зелеными-осенними, а котлеты будут хорошо прожарены)

    О чем я тебе и сказал в [32] (про эмулятор)
  • bvv (18.09.09 14:11) [39]
    Понял.

    До свидания.
    Разберусь с сетями вернусь.
    Конец связи.
    В
 
Конференция "Сети" » Проблема с потоками сканирования [WinXP]
Есть новые Нет новых   [134437   +29][b:0][p:0.001]