Конференция "Сети" » Конверт сетевого адреса ( cardinal ) в читаемый [D7]
 
  • dreamse (28.12.10 20:02) [0]
    Добрый вечер.

    Ситуация такая:

    Получаю активные соеденения с помощью библиотеки iphlpapi.dll

    Данные ip адресов ( локальный, удаленный ) возвращаются в виде набора цифр.

    Необходимо их привести к читаемому виду т.е 192.168.0.1

    Делаю так:


    Uses WinSock;

    s:= inet_ntoa(in_addr(AText));




    В переменой s получаем читаемый вид ip адреса.

    Проблема в том что этот код выполняется чрезвычайно долго, 20 - 25 активных соеденений занимает при выводе в грид 5-7 секунд. С учетом что его нужно обновлять раз в 10 - 20 сек это совершенно неприемлемо. Так как приложение подвисает.

    Думал писать в базу - а уже вьювером читать без тормозов. Оказалось что сервис пишущий в базу так же напрягает процессор на 11 - 19 % при конвертации 20 соеденений. Что конечно же не понравится заказчикам.

    Возможно есть более быстрые функции конвертации значений в читаемый вид ?
  • dreamse (28.12.10 20:03) [1]
    AText это набор цифр - значений ip адреса ( не поменял переменную из грида )
  • dreamse (28.12.10 20:16) [2]
    Пробывал так :


    s:= iNet_ntoa(PInAddr(AText)^);



    Точто так же долго
  • Сергей М. © (28.12.10 21:28) [3]
    Крайне сомнительно что в "тормозах" виновата inet_ntoa(), но если твоя уверенность в этом непокобелима, то ничто не вешает держать готовую таблицу преобразования значения байта в соотв.строковое значение.
  • dreamse (28.12.10 21:56) [4]
    Думаю так и сделаю. Другого варианта нет.
    Спасибо за совет.

    На счет тормозов. Стандартный пример опередления своего ip адреса


    uses
     WinSock;

    function GetLocalIP: String;
    const WSVer = $101;
    var
     wsaData: TWSAData;
     P: PHostEnt;
     Buf: array [0..127] of Char;
    begin
     Result := '';
     if WSAStartup(WSVer, wsaData) = 0 then begin
       if GetHostName(@Buf, 128) = 0 then begin
         P := GetHostByName(@Buf);
         if P <> nil then Result := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
       end;
       WSACleanup;
     end;
    end;



    Если загнать его в цикл с 20 - 40 запросами то визуально видно как долго думает функция преобразования адреса.
    Процессор не нагружает, но долго преобразовывает.

    Спасибо ответ и за совет. Тему можно закрывать.
  • Сергей М. © (28.12.10 22:14) [5]
    А врать-то зачем ?)
    Кроме собственно вызова inet_ntoa() в твоей ф-ции еще куча всякой шняги, которую вовсе необязательно вызывать при каждом проходе цикла)
  • dreamse (28.12.10 22:45) [6]
    Это не моя функция - это пример определения ip адреса из интернета.

    Как ускорить преобразование нашел:

    function GetIP(AIP: DWORD): WideString;
    var bytes: array[0..3] of Byte;
    begin
     Move(AIP, bytes[0], SizeOf(AIP));
     Result := IntToStr(bytes[0]) + '.' +
               IntToStr(bytes[1]) + '.' +
               IntToStr(bytes[2]) + '.' +
               IntToStr(bytes[3]);
    end;

    Вот и вся функция по сути.
    Всем спасибо. Решение найдено.
  • Anatoly Podgoretsky © (28.12.10 22:58) [7]
    > dreamse  (28.12.2010 22:45:06)  [6]

    А почему WideString?
    Зачем нужен bytes?
    Соответсвенно зачем лишняя операция Move?

    Говнокод.
  • dreamse (28.12.10 23:41) [8]
    > Anatoly Podgoretsky ©   (28.12.10 22:58) [7]
    > Говнокод.

    Ну попробуйте уберите любую из операций и переведите адрес :)
    А я посмотрю что у вас получится.

    Без любой строки код не работает.

    Лиш бы сказать что нибудь :)
    Всем спасибо. Тему можно закрывать.
  • Anatoly Podgoretsky © (29.12.10 00:54) [9]
    У меня получится, а у тебя видимо нет. При том не с одной из них, а со всеми сразу.
  • dreamse (29.12.10 10:13) [10]
    > Anatoly Podgoretsky ©   (29.12.10 00:54) [9]

    Вы правы. Переделал.


    function GetIP(IP: DWORD): string;
    begin
     result := IntToStr((IP and $000000FF) shr 0) + '.';
     result := result + IntToStr((IP and $0000FF00) shr 8) + '.';
     result := result + IntToStr((IP and $00FF0000) shr 16) + '.';
     result := result + IntToStr((IP and $FF000000) shr 24);
    end;

  • dreamse (29.12.10 10:15) [11]
    Упростил :)


    function IPtoStr(IP: DWORD): string;
    begin
     result := IntToStr((IP and $000000FF) shr 0) + '.' +
               IntToStr((IP and $0000FF00) shr 8) + '.' +
               IntToStr((IP and $00FF0000) shr 16) + '.' +
               IntToStr((IP and $FF000000) shr 24);
    end;

  • CrytoGen (29.12.10 10:22) [12]
    function IPtoStr(IP:DWORD):String;
    var
     a : array [0..3] of byte absolute IP;
    begin
    Result := IntToStr(a[0]) + '.' +
              IntToStr(a[1]) + '.' +
              IntToStr(a[2]) + '.' +
              IntToStr(a[3]);
    end;

  • Anatoly Podgoretsky © (29.12.10 12:28) [13]
    > dreamse  (29.12.2010 10:13:10)  [10]

    Все равно говно код с лишними операциями.
    Да ладно не дергайся, это не твое.
 
Конференция "Сети" » Конверт сетевого адреса ( cardinal ) в читаемый [D7]
Есть новые Нет новых   [134436   +24][b:0][p:0.002]