Форум: "Сети";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.11;
Скачать: [xml.tar.bz2];




Вниз

Как получить IP адрес компьютера? 


Z   (2002-01-04 23:40) [0]

(для Dialup) Пожалуйстаб кусок кода. Очень нужно! Пробовал компонентыб но это привело к тому, что моя программа висла примерно каждые 3 мин... :-(



Snake2000   (2002-01-05 12:20) [1]

Попробуй так:


var
WSAData : TWSAData;
p : PHostEnt;
Name : array [0..$FF] of Char;

WSAStartup($0101, WSAData);
GetHostName(name, $FF);
p := GetHostByName(Name);
ShowMessage("Your IP is : ",inet_ntoa(PInAddr(p.h_addr_list^)^));
WSACleanup;


Или так:


function LocalIP:string;
type
TaPInAddr=array [0..10] of PInAddr;
PaPInAddr=^TaPInAddr;
var
phe:PHostEnt;
pptr:PaPInAddr;
Buffer:array [0..63] of char;
I:Integer;
GInitData:TWSADATA;
begin
WSAStartup($101, GInitData);
Result:="";
GetHostName(Buffer, SizeOf(Buffer));
phe:=GetHostByName(buffer);
if phe=nil then Exit;
pptr:=PaPInAddr(Phe^.h_addr_list);
I:=0;
while pptr^[I] <> nil do
begin
result:=StrPas(inet_ntoa(pptr^[I]^));
Inc(I);
end;
WSACleanup;
end;






Z   (2002-01-05 17:28) [2]

спасибо, конечно...
Но ни то ни другое не работает - что в uses на до писать?
А первый пример я вообще не понял - это функция или что? Почему Var есть, begin"а с end"ом - нету?

Причем в Faq почему то тоже что-то подобное пишут...
Я думал это вопрос простой...

Ну ладноб может какой профи ответит...
Всем заранее спасибочки!



Snake2000   (2002-01-05 18:00) [3]

Да...... Не ожидал..... А так сойдет?
Код загоняется в любую процедуру или функцию:


var
WSAData : TWSAData;
p : PHostEnt;
Name : array [0..$FF] of Char;
begin
WSAStartup($0101, WSAData);
GetHostName(name, $FF);
p := GetHostByName(Name);
ShowMessage("Your IP is : ",inet_ntoa(PInAddr(p.h_addr_list^)^));
WSACleanup;
end;


Ну, очевидно же, что в uses надо добавить Winsock :)))))) Ну ты даешь !! :))))) На Новый Год перепил что ли...
Порылся бы по форуму, там подобных вопросов уйма...
Оба примера у меня отлично работают, и не мне приводить тебе код готового модуля.



Z   (2002-01-06 17:39) [4]

Я попробовал второй пример, заработало, но прога все-равно виснет... На сколько я понимаю в этом виноват в основном мой провайдер, но как мне это обойти??? Ведь я думал, программе не надо посылать запрос к провайдеру, типа: "Скажите, пожалуйста, а какой у меня IP?" Это и на компе должно как то сохраняться...

А может там куда-нибудь Application.ProcessMessages впиндюрить?

А на счет uses, извини, не знал. Я с интернет-приложениями в первый раз связался, вот и получается такая дремучесть...

А новый пример сейчас опробую...



Z   (2002-01-06 18:36) [5]

Новый пример:
Вставляю в процедуру... получаю:
[Error] manageru.pas(176): Too many actual parameters


Убирaю ShowMessage... на...
form1.currentip:=ipinet_ntoa(PInAddr(p.h_addr_list^)^);

Получаю:
[Error] manageru.pas(165): Undeclared identifier: "ipinet_ntoa"

Winsock в uses стоит.
Что я делаю не так?
(Delphi5)



Z   (2002-01-06 22:57) [6]

Появилась такая идея:

надо сделать второй exe, который будет заниматься только отслеживанием IP. И при изменении IP будет посылать моей программе некое сообщение, содержащее новый IP. Тогда зависать
будет не главная программа, а только IP-Отслеживатель и пользователь этого никак не заметит.

Но вот только как реализовать это самое сообщение???
Если кто знает, помогите!!! Очень прошу!



Knight   (2002-01-07 09:28) [7]

Недавно человек тоже искал по ИП. В поиске нашлось всё необходимое...



Red Alert   (2002-01-07 09:41) [8]

Попробуй...


uses
Windows, SysUtils;
Const
RAS_MaxIpAddress = 15;
RAS_MaxDeviceType = 16;
RAS_MaxEntryName = 256;
RAS_MaxDeviceName = 128;

type
TRASPPPIP = record
dwSize : DWORD;
dwError : DWORD;
szIpAddress : array [0..RAS_MaxIpAddress] of char;
end;

THRASCONN = THandle;
TRASCONN = packed record
dwSize : DWORD;
hRasConn : THRASCONN;
szEntryName : array [0..RAS_MaxEntryName] of char;
{$IFDEF WINVER400}
szDeviceType : array [0..RAS_MaxDeviceType] of char;
szDeviceName : array [0..RAS_MaxDeviceName] of char;
{$ENDIF}
szPadding : array [0..0] of Char;
end;



function RasGetIPAddress: string;
var
RASConns : TRasConn;
dwSize : DWORD;
dwCount : DWORD;
RASpppIP : TRASPPPIP;
begin
Result := "";
RASConns.dwSize := SizeOf(TRASConn);
RASpppIP.dwSize := SizeOf(RASpppIP);
dwSize := SizeOf(RASConns);
if RASEnumConnectionsA(@RASConns, @dwSize, @dwCount) = 0 then begin
if dwCount > 0 then begin
dwSize := SizeOf(RASpppIP);
RASpppIP.dwSize := SizeOf(RASpppIP);
if RASGetProjectionInfoA(RASConns.hRasConn,
RASP_PppIp,
@RasPPPIP,
@dwSize) = 0 then
Result := StrPas(RASpppIP.szIPAddress);
end;
end;
end;



Z   (2002-01-07 18:36) [9]

to Red_Alert:
Спасибо! Вечером сегодня попробую - о результатах напишу.
А все-таки, может кто знает про exe-шники?

Еще раз спасибо всем!



Z   (2002-01-07 22:57) [10]

Вот мне кто-нибудь объяснить может, почему почти все посланные мне примеры не работают? Может у меня Дельфи не такая какая-нибудь (стоит Delphi5)?

У вас то они работают?
Или я что-то не понимаю?

Что я не так делаю-то?
Плиз, Хелп!

to Red_Alert:
[Error] Unit2.pas(43): Undeclared identifier: "RASEnumConnectionsA"



Ghost.   (2002-01-08 09:08) [11]

Ну уж не знаю, что и сказать-то тебе.Первый пример у меня точно работает и уже давольно давно. Причем он вставден в прогу которая кроме этого много че делает и ни одного зависания получено небыло...вот, что тебе посоветовать....



Shrek   (2002-01-27 21:15) [12]

Удалено модератором



Anatoly Podgoretsky   (2002-01-28 10:04) [13]

Z (07.01.02 22:57)
Судя по диагностике, это ты не то делаешь, у тебя не указан модуль, в котором прописан "RASEnumConnectionsA", а может и вообще отсутствует.




Форум: "Сети";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.11;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.02 c
4-33023           is445                 2002-02-12 23:48  2002.04.11  
canvas (please help!)


7-32997           Zmey                  2002-01-17 06:15  2002.04.11  
помогите с TRichEdit


3-32681           Андре_                2002-03-20 08:59  2002.04.11  
Indirect Synchrnization


7-32990           kievsash              2002-01-17 02:24  2002.04.11  
Как из своей проги запустить окошко свойств разделов диска


1-32756           Евгений-Зеленоград    2002-03-29 21:44  2002.04.11  
Математические действия с датой (TdateTime)