Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > как автоматичиски получить следующий IP ?


Автор: BeeMaster 26.7.2009, 21:51
как организовать чтобы программа сама автоматически выдавала следующий IP ???

допустим IP имеет вид 142.000.101.255 и нам надо получить 142.0.102.0
или
142.255.255.255->143.0.0.0

IP может быть любой из возможных!!!

пытался что-то сам написать но вообще ничего не получилось =(


помогите пожалуйста. очень очень надо!

Автор: Keeper89 26.7.2009, 22:06
А где алгоритм с которым проблемы?

Автор: BeeMaster 26.7.2009, 22:29
Код

procedure TS.Button2Click(Sender: TObject);
var
i:integer;
ii:integer;
ips:string;
begin

ips:=edit3.Text;
for i:=100 to 254 do
if ii<>3 then
if copy(ips,Length(ips)-2,3) = inttostr(i) then
begin
ips:=ips+inttostr(i+1);
delete(ips,Length(ips)-4,2);
ii:=3;
edit2.Text:=ips;
end;


но так очень большой гемор делать. тут естественно текст. тоесть из текста выдерается 3 последние символа и проверяется числа это или нет. если это числа то заменяет последние 3 цифры на последние 3 цифры+1. но если получается что число то 255 надо чтобы перекинула на следующий порядок!


но этот способ просто <removed by moderator> какой геморный. и ошибок получается много

помогите пожалуйста!  smile 

Автор: Keeper89 26.7.2009, 23:04
Почему не заменить 1 Edit на 4 SpinEdit и не иметь подобных проблем? Или нужно "именно так"?

Автор: BeeMaster 26.7.2009, 23:18
я новичек и даже не знаю возможностей SpinEdit. по этому использую edit

мне без раздницы можно хоть что использовать лишбы доставая от туда информация была в виде IP

Автор: COOLHack 26.7.2009, 23:38
Кидаем на форму Edit и нопочку. По нажатию на кнопку копируем это:

Код

procedure TForm1.Button1Click(Sender: TObject);
var
a : string;
i1,i2,i3,i4 : string;
s1,s2,s3,s4 : integer;
begin
a := Form1.Edit1.Text;
i1 := copy(a,0,3);
if pos('.',i1) <> 0 then i1 := copy(i1,0,pos('.',i1)-1);
i2 := copy(a,pos('.',a)+1,3);
if pos('.',i2) <> 0 then i2 := copy(i2,0,pos('.',i2)-1);
a := copy(a,pos('.',a)+1,length(a)-pos('.',a)+1);
a := copy(a,pos('.',a)+1,length(a)-pos('.',a)+1);
i3 := copy(a,0,3);
if pos('.',i3) <> 0 then i3 := copy(i3,0,pos('.',i3)-1);
i4 := copy(a,pos('.',a)+1,3);
if pos('.',i4) <> 0 then i4 := copy(i4,0,pos('.',i4)-1);
s1 := strtoint(i1);
s2 := strtoint(i2);
s3 := strtoint(i3);
s4 := strtoint(i4);
if s4 < 255 then begin
  inc(s4);
end else begin
  s4 := 0;
  if s3 < 255 then begin
    inc(s3);
  end else begin
    s3:=0;
    if s2 < 255 then begin
      inc(s2);
    end else begin
      s2 := 0;
      if s1 < 255 then begin
        inc(s1);
      end else begin
        ShowMessage('Больше быть не может :) //');
        s4 := 255;
        s3 := 255;
        s2 := 255;
      end;
    end;
  end;
end;
i1 := inttostr(s1);
i2 := inttostr(s2);
i3 := inttostr(s3);
i4 := inttostr(s4);
Form1.Edit1.text := i1+'.'+i2+'.'+i3+'.'+i4;
end;


P/S/ Код писал на скорую руку, сильно не пинать. 

Автор: BeeMaster 26.7.2009, 23:50
огромное спасибо!!! очень помог!

Автор: Christoph 27.7.2009, 13:17
там есть компонент называется как то hpIpAddres что то такое, похож очень на виндовское поле ввода айпи адресса, с этим компонентом было бы все намного просто

Автор: Snowy 27.7.2009, 14:24
Код

uses WinSock;

.....

function RevertBytes(Value: LongWord): LongWord; // разворачивает байты в/из сетевой порядок
begin
  result := (Value shl 24) or (Value shr 24) or
            (Value shr 8 shl 24 shr 8) or (Value shl 8 shr 24 shl 8);
end;

function NextIp(addr: string): string; // возвращает следующий IP
var h: TInAddr;
begin
  h.S_addr := inet_addr(PChar(addr));
  h.S_addr := RevertBytes(RevertBytes(h.S_addr) + 1);
  Result := inet_ntoa(h);
end;

procedure TForm1.Button1Click(Sender: TObject); // пример использования
begin
  Caption := NextIp('142.0.101.255');
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)