Jump to content


Photo

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


  • Please log in to reply
3 replies to this topic

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 29 November 2013 - 08:46 AM

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
  • 14460 posts
  • LocationMéxico

Posted 29 November 2013 - 09:00 AM


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
  • 4945 posts
  • LocationMéxico

Posted 29 November 2013 - 09:16 AM

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

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 02 December 2013 - 04:58 PM

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.