Получение локального IP адреса [win & linux]

Модератор: Модераторы

Получение локального IP адреса [win & linux]

Сообщение Ism » 19.07.2013 15:59:41

Получение локального IP адреса в некоторых версиях windows и некоторых версиях linux

{$IFDEF WINDOWS},Winsock {$ENDIF},process,strutils

procedure GetCommandResult(Command:string;Params:TStringList);
var
VProcess: TProcess;
begin
VProcess := TProcess.Create(nil);
try
VProcess.Executable:=Command;
VProcess.Parameters:=Params;
VProcess.Options := [poWaitOnExit, poUsePipes];
VProcess.Execute;
Params.LoadFromStream(VProcess.Output);
finally
FreeAndNil(VProcess);
end;
end;

function GetLocalIP: string;
{$IFDEF UNIX}
var
I:Integer;
Params, VStrTemp: TStringList;
{$ENDIF}
{$IFDEF MSWINDOWS}
var
VWSAData: TWSAData;
VHostEnt: PHostEnt;
VName: string;
const CFormatIPMask = '%d.%d.%d.%d';
{$ENDIF}
begin
Result := '';
{$IFDEF UNIX}
VStrTemp := TStringList.Create;
Params:=TStringList.Create;
Params.Add('-n');
GetCommandResult('/sbin/route',Params);
VStrTemp.Clear;
VStrTemp.Sorted:=true;
VStrTemp.Duplicates:=dupIgnore;
for i:=0 to Params.Count-1 do
begin
if (Pos('0.0.0.0',Params[i])>0) and (Pos('U',ExtractWord(4,Params[i],[' ']))>0) then VStrTemp.Add(ExtractWord(8,Params[i],[' ']));
end;
Params.Clear;
Params.Add(VStrTemp[0]);
GetCommandResult('/sbin/ifconfig',Params);
Result:=Params.Text;
Result:=Copy(Result,Pos('inet addr',Result)+10,20);
Result:=Trim(ExtractWord(1,Result,[':',' ']));
FreeAndNil(VStrTemp);
FreeAndNil(Params);
{$ENDIF}
{$IFDEF MSWINDOWS}
{$HINTS OFF}
WSAStartup(2, VWSAData);
{$HINTS ON}
SetLength(VName, 255);
GetHostName(PChar(VName), 255);
SetLength(VName, StrLen(PChar(VName)));
VHostEnt := GetHostByName(PChar(VName));
with VHostEnt^ do
Result := Format(CFormatIPMask, [Byte(h_addr^[0]), Byte(h_addr^[1]),
Byte(h_addr^[2]), Byte(h_addr^[3])]);
WSACleanup;
{$ENDIF}
end;

ev: отредактировал заголовок и добавил примечание
Последний раз редактировалось Ism 20.07.2013 16:19:25, всего редактировалось 2 раз(а).
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Получение локального IP адреса кроссплатформенно

Сообщение ev » 19.07.2013 16:12:47

кроссплатформенно - это не windows xp и windows 7
и даже не windows и linux

Код: Выделить всё
# /sbin/ifconfig eth0
ifconfig: interface eth0 does not exist
ev
долгожитель
 
Сообщения: 1763
Зарегистрирован: 27.04.2005 23:19:06
Откуда: Москва

Re: Получение локального IP адреса кроссплатформенно

Сообщение Ism » 19.07.2013 16:13:32

ev писал(а):кроссплатформенно - это не windows xp и windows 7
и даже не windows и linux

Код: Выделить всё
# /sbin/ifconfig eth0
ifconfig: interface eth0 does not exist

У вас есть правильный вариант ?
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Получение локального IP адреса кроссплатформенно

Сообщение ev » 19.07.2013 16:31:08

нет (я не пишу кроссплатформенных приложений - нет у меня таких пользователей)
но разве это повод называть метод кроссплатформенным?
ev
долгожитель
 
Сообщения: 1763
Зарегистрирован: 27.04.2005 23:19:06
Откуда: Москва

Re: Получение локального IP адреса кроссплатформенно

Сообщение debi12345 » 19.07.2013 16:47:53

В этой задаче однозначно правильно вызывать внешние утиллиты - но не получения списка адресов,а таблиц маршрутизации.

ПС:
С IFCONFIG построжнее - на 2.6+ ядрах и UDEV-е сетевые интерфейсы далеко не всегда имеют имена в формате ETH*, администратор чтобы не путаться и не зависеть от порядка втыкания сеевых карт - может назаначить имена какие душа пожелает - "wan", "lan", "ppp100", "internet",..
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Получение локального IP адреса кроссплатформенно

Сообщение Ism » 19.07.2013 17:11:16

debi12345 писал(а):В этой задаче однозначно правильно вызывать внешние утиллиты - но не получения списка адресов,а таблиц маршрутизации.

ПС:
С IFCONFIG построжнее - на 2.6+ ядрах и UDEV-е сетевые интерфейсы далеко не всегда имеют имена в формате ETH*, администратор чтобы не путаться и не зависеть от порядка втыкания сеевых карт - может назаначить имена какие душа пожелает - "wan", "lan", "ppp100", "internet",..

Ну эта процедура не претендует на совершенство. Если нужно в коде разобраться очень просто. Делфийские примеры всегда приходится переделывать. Поэтому и отравляю сюда рабочие варианты
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Получение локального IP адреса кроссплатформенно

Сообщение debi12345 » 19.07.2013 17:32:42

Переписывайте на чтение и анализ таблицы маршрутизации - будет совершенство :)

Добавлено спустя 23 минуты 20 секунд:
В Линуксе можно так:
Код: Выделить всё
# route -n | grep  "0.0.0.0" | awk '{if ($4 ~ /U/) print $NF}' | sort -u
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Получение локального IP адреса кроссплатформенно

Сообщение Ism » 19.07.2013 19:44:47

debi12345 писал(а):Переписывайте на чтение и анализ таблицы маршрутизации - будет совершенство :)

Добавлено спустя 23 минуты 20 секунд:
В Линуксе можно так:
Код: Выделить всё
# route -n | grep  "0.0.0.0" | awk '{if ($4 ~ /U/) print $NF}' | sort -u

Проверяйте
В первом посте
Упростил вашу команду
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Получение локального IP адреса кроссплатформенно

Сообщение ev » 19.07.2013 20:10:20

Проверяйте

Код: Выделить всё
# /sbin/route -n
usage: route [-dnqtv] command [[modifiers] args]
ev
долгожитель
 
Сообщения: 1763
Зарегистрирован: 27.04.2005 23:19:06
Откуда: Москва

Re: Получение локального IP адреса кроссплатформенно

Сообщение Ism » 19.07.2013 20:15:45

ev писал(а):
Проверяйте

Код: Выделить всё
# /sbin/route -n
usage: route [-dnqtv] command [[modifiers] args]

Не совсем понял, о чем это ?
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Получение локального IP адреса кроссплатформенно

Сообщение debi12345 » 19.07.2013 20:54:00

Упростил вашу команду

Выкинули проверку флага AWK-ом ? Ну это я как всегда перестраховываюсь :) {сетево-админская привычка}
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Получение локального IP адреса кроссплатформенно

Сообщение Ism » 19.07.2013 21:03:31

debi12345 писал(а):
Упростил вашу команду

Выкинули проверку флага AWK-ом ? Ну это я как всегда перестраховываюсь :) {сетево-админская привычка}

Если бы получить то же из /proc было бы лучше и быстрее
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Получение локального IP адреса кроссплатформенно

Сообщение ev » 19.07.2013 21:05:01

Не совсем понял, о чем это ?

о том, что route -n тоже не кроссплатформенно ;)
ev
долгожитель
 
Сообщения: 1763
Зарегистрирован: 27.04.2005 23:19:06
Откуда: Москва

Re: Получение локального IP адреса кроссплатформенно

Сообщение Ism » 19.07.2013 21:11:39

ev писал(а):
Не совсем понял, о чем это ?

о том, что route -n тоже не кроссплатформенно ;)

Я знаю, если вы знаете другое, пишите
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Получение локального IP адреса кроссплатформенно

Сообщение ev » 19.07.2013 21:39:50

Я знаю

зачем тогда вводить людей в заблуждение и называть метод кроссплатформенным?
ev
долгожитель
 
Сообщения: 1763
Зарегистрирован: 27.04.2005 23:19:06
Откуда: Москва

След.

Вернуться в Алгоритмы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru