Ir al contenido


Foto

[MULTILENGUAJE] Obtener la dirección Broadcast de una red


  • Por favor identifícate para responder
3 respuestas en este tema

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 29 noviembre 2013 - 08:46

Si necesitamos enviar un "mensajito" a todos los PCs de una red de golpe, tendremos que conocer la dirección Broadcast. Este truco va encaminado a encontrar esa dirección IP por código de forma automatizada.

En este truco he dejado otra función interesante, GetCurrentIP, que nos informa de la IP de la máquina local actual.
 

delphi
  1. uses
  2.   Windows, WinSock...;
  3.  
  4. type
  5. TMIB_IPADDRROW = packed record
  6.   dwAddr: DWORD;
  7.   dwIndex: DWORD;
  8.   dwMask: DWORD;
  9.   dwBCastAddr: DWORD;
  10.   dwReasmSize: DWORD;
  11.   unused1: SmallInt;
  12.   wType: SmallInt;
  13. end;
  14.  
  15. TMIB_IPADDRTABLE = record
  16.   dwNumEntries: DWORD;
  17.   table: array[0..0] of TMIB_IPADDRROW;
  18. end;
  19. PMIB_IPADDRTABLE = ^TMIB_IPADDRTABLE;
  20.  
  21. function GetIpAddrTable(IpAddrTable: PMIB_IPADDRTABLE; pdwSize: PULONG;
  22.   Order: BOOL): DWORD; stdcall; external 'iphlpapi.dll' name 'GetIpAddrTable';
  23.  
  24. implementation
  25.  
  26. function GetCurrentIP: DWORD;
  27. var
  28.   Wsa: WSADATA;
  29.   Name: array[0..255] of char;
  30.   hostinfo: PHOSTENT;
  31. begin
  32.   Result:= 0;
  33.   FillChar(Wsa, SizeOf(WSAData), 0);
  34.   if WSAStartup(MAKEWORD(2, 2), Wsa) = 0 then
  35.   begin
  36.     if gethostname(Name, SizeOf(Name)) = 0 then
  37.     begin
  38.       hostinfo:= gethostbyname(Name);
  39.       if hostinfo <> nil then
  40.         Result:= PDWORD(hostinfo^.h_addr_list^)^;
  41.     WSACleanup;
  42.     end;
  43.   end;
  44. end; 
  45.  
  46. function GetBrodcastAddress: String;
  47. var
  48.   pIPAddrTable: PMIB_IPADDRTABLE;
  49.   dwSize: DWORD;
  50.   i: integer;
  51.   BroadCastInAddr: IN_ADDR;
  52. begin
  53.   BroadCastInAddr.S_addr:= 0;
  54.   dwSize:= 0;
  55.   GetIpAddrTable(nil, @dwSize, true);
  56.   GetMem(pIPAddrTable, dwSize);
  57.   if pIPAddrTable<>nil then
  58.   begin
  59.     if GetIpAddrTable(pIPAddrTable, @dwSize, true) = NO_ERROR then
  60.       for i:=0 to  pIPAddrTable^.dwNumEntries-1 do
  61.       begin
  62.         if GetCurrentIP = pIPAddrTable^.table[i].dwAddr then
  63.         begin
  64.           BroadCastInAddr.S_addr:= pIPAddrTable^.table[i].dwAddr or not pIPAddrTable^.table[i].dwMask;
  65.           break;
  66.         end;
  67.       end;
  68.     FreeMem(pIPAddrTable);
  69.   end;
  70.   Result:= inet_ntoa(BroadCastInAddr);
  71. end;

Espero que el truco sea de utilidad y le deis un uso correcto sin maldades. *-)


Saludos.
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 29 noviembre 2013 - 09:00


Espero que el truco sea de utilidad y le deis un uso correcto sin maldades. *-)


Estás viendo que el niño es risueño y le haces cosquillas :D :D :D

Interesante hilo, ya veremos que hacer con el código :)

Saludos
  • 0

#3 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 29 noviembre 2013 - 09:16

Gracias por el truco amigo mio. :D Esto va pal face :D
  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 02 diciembre 2013 - 04:58

No podía dejar terminar el hilo sin poner el equivalente de este truco en C
 

cpp
  1. #include <windows.h>
  2. #include <winsock2.h>
  3. #include <iphlpapi.h>
  4.  
  5. #pragma comment(lib, "iphlpapi.lib")
  6.  
  7. String GetBroadcastAddressString()
  8. {
  9.   IN_ADDR BroadCastInAddr;
  10.   PMIB_IPADDRTABLE pIPAddrTable;
  11.   DWORD dwSize = 0;
  12.   WSADATA Wsa;
  13.   PHOSTENT hostinfo;
  14.   DWORD CurrentIP = 0;
  15.   char Name[MAX_PATH];
  16.  
  17.   BroadCastInAddr.S_un.S_addr = 0;
  18.  
  19.   if(WSAStartup(MAKEWORD(2,2),&Wsa) == 0){
  20.     if(gethostname(Name, MAX_PATH) == 0){
  21.       if((hostinfo = gethostbyname(Name)) != NULL)
  22.         CurrentIP = *(DWORD*)*hostinfo->h_addr_list;
  23.     }
  24.     WSACleanup( );
  25.   }
  26.   GetIpAddrTable(0, &dwSize, 0);
  27.   pIPAddrTable = (MIB_IPADDRTABLE*)malloc(dwSize);
  28.   if(pIPAddrTable){
  29.     if(GetIpAddrTable(pIPAddrTable, &dwSize, 0) == NO_ERROR){
  30.       for(int i=0; i < (int)pIPAddrTable->dwNumEntries; i++){
  31.         if(CurrentIP == pIPAddrTable->table[i].dwAddr)
  32.           BroadCastInAddr.S_un.S_addr = pIPAddrTable->table[i].dwAddr | ~pIPAddrTable->table[i].dwMask;
  33.       }
  34.     }
  35. free(pIPAddrTable);
  36. }
  37.   return inet_ntoa(BroadCastInAddr);
  38. }

Saludos.
  • 0




IP.Board spam blocked by CleanTalk.