Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.006 c
1-32883
roman-tutov@mail.ru
2002-03-29 16:49
2002.04.11
ComboBox


1-32786
Vcoder
2002-03-30 20:41
2002.04.11
Формат Base64 или UUE - кодирования


3-32633
KaPaT
2002-03-18 20:40
2002.04.11
Помогите с легким вопросом!


1-32738
P.
2002-03-29 18:15
2002.04.11
Form


3-32684
Eduard
2002-03-20 11:19
2002.04.11
IBDataset.ParamByName





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский