Форум: "Сети";
Текущий архив: 2002.04.11;
Скачать: [xml.tar.bz2];
ВнизОпять поднимаю вопрос, как определить в Delphi IP адрес полученный от проваёдера? Найти похожие ветки
← →
Hawk (2001-11-14 21:54) [0]Вообщем я НИКАК не могу разобраться.... все эти gethostname и getbyhostname нихрена не помогают ... я уже почти в панике :(
Настройка IP для Windows 98
0 Ethernet: плата :
!!!---> IP-адрес. . . . . . . . . . . . . . : 62.118.131.131
Маска подсети . . . . . . . . . . . : 255.0.0.0
Стандартный шлюз. . . . . . . . . . : 62.118.131.131
1 Ethernet: плата :
IP-адрес. . . . . . . . . . . . . . : 169.254.197.236
Маска подсети . . . . . . . . . . . : 255.255.0.0
Стандартный шлюз. . . . . . . . . . :
ВОТ это выдаёт классная(!) прога которая прилагается с виндой (ipconfig.exe). Как мне определить не мой локальный а инетовский который показан стрелкой????????? SOS
← →
Brand (2001-11-15 01:32) [1]Есть только прога, которая определит все эти IP и еще даже 127.0.0.1
Но вот как из них всех выделить именно Инетовский - это мне тоже интерестно.
← →
SKiwa (2001-11-15 14:04) [2]На самом деле они оба Инетовские.
Если речь идет об определении адреса через который нужно стучаться к провайдеру, то это другой разговор.
Это можно определить косвенно, по "стандартному шлюзу" и больше никак.
А если речь о разделении на Internet/Intranet адреса, то для Intranet выделено несколько подсетей - 10.x.x.x(255.0.0.0), 192.168.x.x(255.255.0.0), и (если не ошибаюсь) 176.дальше не помню.
Ну и поскольку их мало, то можно легко проверить пренадлежность текущего адреса диапазонам Intranet, в приведеном примере Intranet адреса нет.
← →
Hawk (2001-11-15 15:17) [3]Вообщем я написал клиент и сервер на Win сокетах....
и хочу чтобы сервер отсылал мне IP адрес машины на которой он установлен, чтобы я мог к серверу подключиться. вообщем не проблема пусть определяет ВСЕ IP адреса.. главное чтобы в эти все входил и тот адрес который стрелкой обозначен.. я так думаю...
PS: все могу получить а нужный нет :(
← →
Wonder (2001-11-15 15:25) [4]Если тебе известен твой локальный адрес и ты можешь получить все адреса, то в чем проблема-то? Нужный тебе адрес будет "не локальный". Сравнивай да выбирай.
← →
Hawk (2001-11-15 18:11) [5]to Wonder: в том то и оно ВСЕ адреса( тоесть вместе с нужным) не получается найти..
так вот я решил убрать сетевую плату из конфигурации виндов .. и теперь gethostname getbyhostname работает как надо... в принципе это выход.. НО всёже через задницу... :(
← →
Kornet (2001-11-16 08:33) [6]Извини, я не понял, но ведь когда приходит пакет и запускается событие, то в параметрах всегда передаётся IP-клиента, который послал пакет??? Разве нет?
← →
SKiwa (2001-11-16 10:32) [7]>Hawk
Есть два простых способа оба базируются на Broadcast.
1. Сервер регулярно, с некоторыми промежутками посылает Broadcast сообщение в котором присутствует информация для подключения к нему, а клиент при запуске ждет этого сообщения, и только после получения подключается к серверу.
2. Клиент при запуске посылает Broadcast сообщение, по смыслу означающее поиск сервера, Сервер в ответ посылает свои параметры, Киент подключается к серверу.
Естественно второй подход лучше.
При этом есть маленькая проблемка - Broadcast сообщения не маршрутизируются, т.е. если между клиентом и сервером есть маршрутизатор, то Broadcast через него не пройдет, но и эту проблему при желании можно решить.
← →
Wonder (2001-11-16 10:42) [8]Это почему же не получается-то?
To get your address without opening a socket first, do a gethostbyname() on the value gethostname() returns. This will return a LIST of ALL the host"s interfaces.
← →
Hawk (2001-11-16 15:55) [9]да....... но мне возвращает вот эта штука ТОЛЬКО оди мой локальный адрес...
может я просто ламерю?! вот код:
var WSAData : TWSAData; p : PHostEnt; Name : array [0..$FF] of Char;
WSAStartup($0101, WSAData);
GetHostName(name, $FF);
p := GetHostByName(Name);
richedit1.Lines.Add(inet_ntoa(PInAddr(p.h_addr_list^)^)); - вот здесь мне
WSACleanup; выдаётся ТОЛЬКО
локальный адрес
:(
← →
Wonder (2001-11-16 16:53) [10]while (p.h_addr_list^ <> nil) do
begin
richedit1.Lines.Add(inet_ntoa(PInAddr(p.h_addr_list^)^));
inc(p.h_addr_list);
end;
Где-то так.
← →
Hawk (2001-11-16 17:26) [11]ЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕ....
СПАСИБО!!!!!!!!!!!! просто супер!
← →
Anatoly Podgoretsky (2001-11-16 21:07) [12]SKiwa © (16.11.01 10:32)
1. Сервер регулярно, с некоторыми промежутками посылает Broadcast сообщение
Это не сервер, а какой то спаммер :-)
← →
iZEN (2001-11-17 04:01) [13]А если с клиента посылать широковещательный запрос, на который сможет откликнуться сервер? В этом случае, сервер будет только слушать и вести себя тихо до поры, до времени.
Правда, всякие маршрутизаторы и брандмауэры могут дело всё подпортить.
← →
Anatoly Podgoretsky (2001-11-17 12:43) [14]Если все это не доступно, то опубликовать на доступном веб сервере страничку, в которой указывать текущий ИП сервера, так некоторые организовываю сервера при динамическом подключении через диалап
← →
Юрий Павленко (2001-11-17 14:02) [15]Хорошая идея. Я тоже об этом много думал. Можно даже не публиковать
адрес, а просто делать форвард (есть в RFC соответствующий код,
насколько я помню), и тем самым решить проблему большого трафика -
при форварде он минимален, а основная нагрузка ляжет на машину
диалап, у которой оплачивается только время подключения, а не
трафик (как правило). А если заплатить за унлимит, то можно
держать таким образом сервер в сети и вовсе постоянно.
← →
Anatoly Podgoretsky (2001-11-17 15:18) [16]Ну разумеется под публикацией именно это и подразумевается, если речь про веб, а для других целей просто получение динамического адреса сервера.
← →
Yarix (2001-11-23 00:58) [17]program PPP_IP;
uses RAS_H, Windows;
{$R *.res}
{$R Yarix.res}
var bufsize: Longint;
numEntries: Longint;
x: Integer;
entries: Array[1..100] of TRasConn;
RasPppIp :TRasPppIp;
RasPppIpSize :integer;
ServerIP:string;
ClientIP:string;
Connection:string;
begin
entries[1].dwSize := SizeOf(TRasConn);
bufsize := SizeOf(TRasConn) * 100;
if RasEnumConnections(@entries[1], bufsize, numEntries) = 0 then
if numEntries > 0
then
for x := 1 to numEntries do
begin
Connection:=entries[x].szEntryName;
RasPppIpSize:=SizeOf(TRasPppIp);
RasPppIp.dwSize:=RasPppIpSize;
if RASGetProjectionInfo(entries[x].HRASCONN,RASP_PppIp,@RasPppIp,RasPppIpSize)<>0 then
begin
MessageBox(GetDesktopWindow,
"You are not connected to the Internet"+#10#13+"or your connection is not working properly.",
"PPP IP",
MB_OK or MB_ICONWARNING);
Halt;
end;
ServerIP:=RasPppIp.szServerIpAddress;
ClientIP:=RasPppIp.szIpAddress; ------ ВОТ ЧЕ ТЕ НАДО
MessageBox(GetDesktopWindow,
PChar("Remote Dial-Up Server""s IP Address: "+#9+ServerIP+#13#10+#13#10+
"PPP does not require that server provides his address, but"+#13#10+
"Windows NT servers will consistently return the address anyway."+#13#10+
"Other PPP vendors may not provide the address."+#13#10
),
PChar(Connection),MB_OK or MB_ICONWARNING);
end
else
begin
MessageBox(GetDesktopWindow,
"You are not connected to the Internet"+#10#13+"or your connection is not working properly.",
"PPP IP",
MB_OK or MB_ICONWARNING);
end;
end.
← →
Brand (2001-11-24 00:31) [18]>Yarix
А где можно скачать вот-этот RAS_H?
← →
Hawk (2001-11-24 21:06) [19]а что делает этот код?
← →
copyr25 (2002-01-26 07:13) [20]unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Winsock;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
function GetLocalIP: String;
type
PPInAddr = ^PInAddr;
var
wsaData: TWSAData;
HostInfo: PHostEnt;
HostName: Array[0..255] of Char;
Addr: PPInAddr;
begin
Result := "";
if WSAStartup($0102, wsaData) <> 0 then
exit;
try
if gethostname(HostName, SizeOf(HostName)) <> 0 then
exit;
HostInfo := gethostbyname(HostName);
if HostInfo = nil then
exit;
Addr := Pointer(HostInfo^.h_addr_list);
if (Addr = nil) or (Addr^ = nil) then
exit;
Result := StrPas(inet_ntoa(Addr^^));
inc(Addr);
while Addr^ <> nil do
begin
Result := Result + ^M^J + StrPas(inet_ntoa(Addr^^));
inc(Addr);
end;
finally
WSACleanup;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption:=GetLocalIP;
end;
end.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.04.11;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.007 c