-
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]
Все равно говно код с лишними операциями.
Да ладно не дергайся, это не твое.