Алгоритм получения диапазона IP

zAlexandrz
Дата: 14.11.2007 20:44:20
Нужна помощь.
Как получить диапазон IP.
Есть два значения:
start:='192.168.1.1'
stop:='192.168.10.20'
Как получить массив всех IP в этом диапазоне?
Кто нибудь делал программу, подскажите пожалуйста.
Anatoly Podgoretsky
Дата: 14.11.2007 21:13:53
Превратить в число, дальше простой цикл с обратным превращением. Функции находятся в WinAPI
zAlexandrz
Дата: 14.11.2007 21:24:50
То что превратить в число я догадался, разбил даже на 4 части, а дальше запутался.

Конкретней пожалуйста!
Anatoly Podgoretsky
Дата: 14.11.2007 21:32:55
Не надо разбивать на части. '192.168.1.1' это всего лишь текстовое представление 32 битного числа.
for I := StartN to StopN do
Ты справку по WinAPI посмотрел или нет?
Что ты знаешь про сети?
zAlexandrz
Дата: 14.11.2007 22:10:27
создаю программу клиент - сервер для синхронизации файлов в локальной сети.

сделал на быструю руку для фиксированных АЙПИ, временно облегчил себе жизнь, теперь надо ее переделать так чтобы она стала более универсальная, сама находила сервера в локальной сети. Как это сделать знаю, но для начала мне необходимо получить МАССИВ IP В ЗАДАННОМ ДИАПАЗОНЕ, с Ваших слов я понял, это очень легко и быстро, буквально 5-6 строк. В этом только загвоздка, не знаю я функции все WinAPI, справку смотрел, не увидил я там.

Я не програмист, и изучать досконально делфи мне нет смысла, так как без практики я все равно забуду то что изучил.

просто прошу мне помочь, выложить код.

сделал с вашего совета так:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  i,start,stop:integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
start:=strtoint('192.168.1.1');
stop:=strtoint('192.169.1.1');
for i:=startn to stopn do
memo1.Lines.Add(inttostr(i))
end;
end.

не работает.
Поправте меня
-Sergey-
Дата: 14.11.2007 23:26:23
http://delphikingdom.ru/asp/viewitem.asp?catalogid=1060
хорошая статья - советую прочитать
там описано что такое адрес

-

Цель в жизни определяет все..
Выбор есть всегда..
Но мы часто не хотим его делать..
zAlexandrz
Дата: 15.11.2007 14:16:40
Спасибо за помощь,
справился без WINAPI


Может кому пригодится:


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Memo1: TMemo;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    Button1: TButton;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  i,count:integer;
  start,stop:array[1..4] of integer;
  resultip:array[1..100000]of string[16];

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
count:=1;
start[1]:=strtoint(edit1.Text);
start[2]:=strtoint(edit2.Text);
start[3]:=strtoint(edit3.Text);
start[4]:=strtoint(edit4.Text);
stop[1]:=strtoint(edit5.Text);
stop[2]:=strtoint(edit6.Text);
stop[3]:=strtoint(edit7.Text);
stop[4]:=strtoint(edit8.Text);
repeat
for i:=1 to 4 do
resultip[count]:=resultip[count]+inttostr(start[i])+'.';
delete(resultip[count],length(resultip[count]),1);
start[4]:=start[4]+1;
count:=count+1;
for i:=4 downto 2 do
  if start[i]>255 then
  begin
  start[i]:=0;
  start[i-1]:= start[i-1]+1;
  end;
until (start[1]=stop[1])and(start[2]=stop[2])and(start[3]=stop[3])and(start[4]=stop[4]+1);

count:=count-1;
for i:=1 to count do
memo1.Lines.Add(resultip[i]);
end;
end.

Тему можно закрывать
Sk(A)
Дата: 15.11.2007 14:39:10
uses CommCtrl,WinSock;

procedure TForm1.Button1Click(Sender: TObject);
var
  IP: Integer;

  function GetIP(IP : integer) : String;
  begin
    SendMessage(Handle, IPM_GETADDRESS, 0, Longint(PDWORD(@IP)));
    Result := IntToStr(FIRST_IPADDRESS(IP))+
        '.' + IntToStr(SECOND_IPADDRESS(IP)) +
        '.' + IntToStr(THIRD_IPADDRESS(IP)) +
        '.' + IntToStr(FOURTH_IPADDRESS(IP));
  end;

  procedure SetIP(const Value: String);
    function MakeIPAddressEx(b1, b2, b3, b4: Char):LPARAM;
    begin
      Result := MAKEIPADDRESS(DWORD(b1), DWORD(b2), DWORD(b3), DWORD(b4));
    end;
  var
    Tmp: TInAddr;
  begin
    Tmp.S_addr := inet_addr(PChar(Value));
    if Tmp.S_addr = INADDR_NONE then Exit;
    with Tmp.S_un_b do
      IP := MakeIPAddressEx(s_b1, s_b2, s_b3, s_b4);
    SendMessage(Handle, IPM_SETADDRESS, 0, IP);
  end;
begin
  SetIP('192.168.1.255');
  ShowMessage(GetIp(IP));
end;