Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.11;
Скачать: CL | DM;

Вниз

Опять поднимаю вопрос, как определить в 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.011 c
3-32700
MAxiMum
2002-03-13 15:23
2002.04.11
Изменения в сетевой БД


6-32921
Chris
2002-01-26 15:46
2002.04.11
Повтор вопроса. Как отправить HTML по почте?


4-33027
AndrewBee
2002-01-26 15:28
2002.04.11
WinRar


3-32654
Hermit
2002-03-19 18:07
2002.04.11
BDE: Программная смена языка драйвера BDE


4-33016
Python
2002-02-12 07:40
2002.04.11
Надо получить результаты работы программы (ее вывод на консоль) запуская ее из собственной программы, наример, с помощью ShellExecuteEx