Форум: "Сети";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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.




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




Наверх





Память: 0.77 MB
Время: 0.023 c
1-32735           cypher                2002-03-30 01:08  2002.04.11  
Мож кто знает?!


14-32974          Nest                  2002-03-05 14:08  2002.04.11  
Юмор про программистов http://evny.com.ua/?hist/pmer00


1-32865           LazorenkoX            2002-03-29 11:02  2002.04.11  
Создание компонент


1-32898           Cupor                 2002-03-29 19:08  2002.04.11  
Панаели инструментов как в Photoshope


3-32657           Брат                  2002-03-20 09:10  2002.04.11  
Не открывается таблица....