Форум: "Сети";
Текущий архив: 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", а может и вообще отсутствует.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.04.11;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c