Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Comparar IP`s con la finalidad si son del mismo segmento de red (https://www.clubdelphi.com/foros/showthread.php?t=86499)

rchavezh 22-08-2014 06:33:25

Comparar IP`s con la finalidad si son del mismo segmento de red
 
Hola requiero de su ayuda apra realziar lo siguiente

estoy desarrolando una aplicacion de chat interno para una empresa

la aplicacion ya funciona pero resulta que se require validad que las ips en comunicacion sean del mismo segmento de red

yo se que por ejemplo si

equipo a tiene 192.168.1.34 mascara 255.255.255.0
y el equipo b tiene 192.168.1.35 mascara 255.255.255.0

los equipos pertencen a la misma red

al momento no he encontrado como obtener la mascara de sub red para programar la funcion que realize los comprativos

de antemano muchas gracias

juanelo 22-08-2014 19:32:43

Que tal rchavezh,
Dificilmente vas obtener la mascara de subred de la maquina que responde (si es que esta no la envía explicitamente el equipo que responde dentro de los mensajes que se intercambian), pero lo que si tienes es la IP Local, la Mascara Local y la IP del equipo que responde.
Para saber si dos IP corresponden a la misma "subred", lo que unico que tienes que hacer es "aplicar binariamente la submascara de Red" que que tienes, si el resultado de cada segmento de la IP resultasen iguales entonces te encuentras en la misma "subred".
Para obtener la informacion de tu red local (en realidad de todos los adaptadores de red conectados a tu maquina, y si es un equipo basado en windows) puedes usar las funciones de la API:GetAdaptersInfo
Saludos

ecfisa 22-08-2014 21:52:39

Hola rchavezh.

Es como te explica juanelo, te pongo un código de aproximación como ejemplo:
Código Delphi [-]
....
type
  TNetClass = (A, B, C);

const
  NETCLASS: array[TNetClass] of Byte = (8, 16, 24);

procedure TForm1.FormCreate(Sender: TObject);
begin
  EditIP1.Text:= '163.209.141.0';
  EditIP2.Text:= '163.209.142.23';
  EditMask1.Text:= '255.255.255.0';
  EditMask2.Text:= '255.255.255.0';
end;

function IPToBin(const IP: string): string;
  function ToBin(Value: Integer): string;
  var
    i: Integer;
  begin
    Result:= '';
    for i:= 7 downto 0 do
      Result := Result+ Chr(Ord('0')+ (Value shr i and 1));
  end;
var
  TS: TStrings;
  i: Integer;
begin
  Result:= '';
  TS:= TStringList.Create;
  try
    TS.Delimiter:= '.';
    TS.DelimitedText:= IP;
    for i:= 0 to TS.Count-1 do
      Result:= Result + ToBin(StrToInt(TS[i]))+'.';
    SetLength(Result, Length(Result)-1);
  finally
    TS.Free;
  end;
end;
function ProcessIP(ip, ms: string): string;
var
  TS: TStrings;
  v1,v2: array[0..3] of Integer;
  i: Integer;
begin
  TS:= TStringList.Create;
  try
    TS.Delimiter:= '.';
    TS.DelimitedText:= ip;
    for i:= 0 to 3 do v1[i]:= StrToInt(TS[i]);
    TS.DelimitedText:= ms;
    for i:= 0 to 3 do v2[i]:= StrToInt(TS[i]);
    for i:= 0 to 3 do Result:= Result +IntToStr(v1[i] and v2[i]) + '.';
    SetLength(Result,Length(Result)-1);
  finally
    TS.Free;
  end;
end;

function SameNetwork(net1, net2: string; const submask: Integer): Boolean;
var
  i: Integer;
begin
  Result:= True;
  net1:= StringReplace(net1, '.', '', [rfReplaceAll]);
  net2:= StringReplace(net2, '.', '', [rfReplaceAll]);
  for i:= 1 to submask do
  begin
    if net1[i]<>net2[i] then
    begin
      Result:= False;
      Exit;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  r1, r2: string;
begin
  r1:= IPToBin(ProcessIP(EditIP1.Text, EditMask1.Text));
  r2:= IPToBin(ProcessIP(EditIP2.Text, EditMask2.Text));
  if SameNetwork(r1, r2, NETCLASS[C]) then
    ShowMessage('IP2 pertenece a la misma subred clase C')
  else
    ShowMessage('IP2 no pertenece a misma subred clase C'); //<--
  // Sin embargo,
  if SameNetwork(r1, r2, NETCLASS[b]) then
    ShowMessage('IP2 pertenece a la misma subred clase B')  //<--
  else
    ShowMessage('IP2 no pertenece a misma subred clase B');
  // y, en este caso, es claro que también pertenece a clase A
end;

Saludos :)


La franja horaria es GMT +2. Ahora son las 07:25:59.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi