Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Subnetmask bzw. Broadcastadresse ermitteln (https://www.delphipraxis.net/161290-subnetmask-bzw-broadcastadresse-ermitteln.html)

Poolspieler 27. Jun 2011 12:50

Subnetmask bzw. Broadcastadresse ermitteln
 
Hallo,
ich will mit einem TIdUDPClient an die Broadcastadresse (NICHT Multicast) aller Netzwerk-Interfaces des PCs Daten verschicken.

Mit
Delphi-Quellcode:
uses
  WinSock;

function GetLocalIPs: string;
type
  PPInAddr = ^PInAddr;
var
  wsadata : TWSAData;
  hostinfo : PHostEnt;
  addr : PPInAddr;
begin
  Result := '';

  if(WSAStartUp(MAKEWORD(1,1),wsadata) = 0) then
  try
    hostinfo := gethostbyname(nil);
    if(hostinfo <> nil) then begin
      addr := pointer(hostinfo^.h_addr_list);

      while(addr^ <> nil) do begin
        Result := Result + inet_ntoa(addr^^) + ^M^J;
        inc(addr);
      end;
    end;
  finally
    WSACleanUp;
  end;
end;
(aus Thread http://www.delphipraxis.net/2651-lok...ermitteln.html)

--> kann man alle lokalen IPs ermitteln. Wenn ich jetzt dazu jeweils noch die Subnetmask bekäme, dann wäre ich glücklich. Dann könnte ich nämlich die Broadcastadressen berechnen...

Kann mir jemand helfen?

Gruß,

Poolspieler

Klaus01 27. Jun 2011 16:09

AW: Subnetmask bzw. Broadcastadresse ermitteln
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
USock.EnumInterfaces(s);
ShowMessage(s);
end;

Hope it helps,
Hokki

*************************************************

unit InterfaceInfo;

interface

uses Windows, Winsock;

function EnumInterfaces(var sInt: string): Boolean;

function WSAIoctl(s: TSocket; cmd: DWORD; lpInBuffer: PCHAR; dwInBufferLen:
  DWORD;
  lpOutBuffer: PCHAR; dwOutBufferLen: DWORD;
  lpdwOutBytesReturned: LPDWORD;
  lpOverLapped: POINTER;
  lpOverLappedRoutine: POINTER): Integer; stdcall; external 'WS2_32.DLL';



const
  SIO_GET_INTERFACE_LIST = $4004747F;
  IFF_UP = $00000001;
  IFF_BROADCAST = $00000002;
  IFF_LOOPBACK = $00000004;
  IFF_POINTTOPOINT = $00000008;
  IFF_MULTICAST = $00000010;

type
  sockaddr_gen = packed record
    AddressIn: sockaddr_in;
    filler: packed array[0..7] of char;
  end;

type
  INTERFACE_INFO = packed record
    iiFlags: u_long;
    iiAddress: sockaddr_gen;
    iiBroadcastAddress: sockaddr_gen;
    iiNetmask: sockaddr_gen;
  end;

implementation

function EnumInterfaces(var sInt: string): Boolean;
var
  s: TSocket;
  wsaD: WSADATA;
  NumInterfaces: Integer;
  BytesReturned, SetFlags: u_long;
  pAddrInet: SOCKADDR_IN;
  pAddrString: PCHAR;
  PtrA: pointer;
  Buffer: array[0..20] of INTERFACE_INFO;
  i: Integer;
begin
  result := true;
  sInt := '';

  WSAStartup($0101, wsaD);

  s := Socket(AF_INET, SOCK_STREAM, 0);
  if (s = INVALID_SOCKET) then
    exit;

  try
    PtrA := @bytesReturned;
    if (WSAIoCtl(s, SIO_GET_INTERFACE_LIST, nil, 0, @Buffer, 1024, PtrA, nil,
      nil)
      <> SOCKET_ERROR) then
    begin
      NumInterfaces := BytesReturned div SizeOf(INTERFACE_INFO);

      for i := 0 to NumInterfaces - 1 do {Loop trough all interfaces}
      begin
        pAddrInet := Buffer[i].iiAddress.addressIn;
        pAddrString := inet_ntoa(pAddrInet.sin_addr);
        sInt := sInt + ' IP Address: ' + pAddrString + ',';
        pAddrInet := Buffer[i].iiNetMask.addressIn;
        pAddrString := inet_ntoa(pAddrInet.sin_addr);
        sInt := sInt + ' Subnet Mask: ' + pAddrString + ',';
      end;
    end;
  except
  end;
  CloseSocket(s);
  WSACleanUp;
  result := false;
end;
geklaut von hier

Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz