![]() |
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:
(aus Thread
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; ![]() --> 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 |
AW: Subnetmask bzw. Broadcastadresse ermitteln
Delphi-Quellcode:
geklaut von
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; ![]() Grüße Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz