Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Mensaje para todas las maquinas de una subred(Para Leo).

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Mensaje para todas las maquinas de una subred(Para Leo). Responder citando

Buenas para quien leea

En primera instancia cual es mi problema :

Bueno, estoy tratando de hacer un broad cast, es decir mandar un mensaje a todas las maquinas de una sub red, me hace falta que sea compatible con win 95 o mas.... Ya se como hacerlo pero para esto me hace falta tener el Ip de mi maquina y la mascara de red, aqui encontre como obtener el ip de un forma mas logica que la que tenia pero todavia debo la mascara. Con estos dos datos puedo calcular la direccion de broad cast.

Me pudieran decir como obtengo la mascara (Claro estoy hablando de codigo en C++ o en Api) ???

Para quien le interece la solucion teniendo el ip y la mascara:

Primero que todo se toman todos los numeros, del numero Ip y se convierten a binario es decir para el numero:

192.168.17.67

se transformaria en:

11000000.10101000.00010001.01000011

la posible mascara:

255.255.255.0

se transforma en:

11111111.11111111.11111111.00000000

Se hace un and logico digito a digito, entre el Ip y la mascara para obtener el Ip de la red:

11000000.10101000.00010001.00000000

Que seria en decimal el numero:

192.168.17.0

Luego de derecha a izquierda mientras exista 0 en la mascara se cambian por 1 en el Ip de la red, obteniendo en el ejemplo. Asi es entonces que se obtiene la direccion de Broad Cast:

11000000.10101000.00010001.11111111

Que seria en decimal el numero:

192.168.17.255

Y esto es todo. Dar la implementacion me parece tedioso y largo.
_________________
Saludos para todos recuerden pueden contactarme por correo en la direccion >> lcarballlo@ghost.matcom.uh.cu
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola:

Aquí va una forma de conseguir la mascara en todas las versiones de Windows excepto Windows95.

Si necesitas que funcione también en Win95 tienes que instalar la versión 2 de la libreria Winsock.
    [Winsock 2 update]
    http://www.microsoft.com/.../W95Sockets2/Default.asp

- Creamos un proyecto nuevo y le añadimos un TListBox (ListBox1) y un botón.

- Añadimos las siguientes cabeceras:
Código:
#include <winsock2.h>
#include <ws2tcpip.h>

- Añadimos las siguientes declaraciones en la parte privada de la clase de nuestro form:
Código:
private:   // User declarations

    // Donde recibiremos la lista de interfaces
    INTERFACE_INFO m_interfaceInfo[32];

    int __fastcall GetInterfaceInfo(void);

- Implementamos la función GetInterfaceInfo:
Código:
//---------------------------------------------------------------------------
// Devuelve el numero de interfaces
//  -1 en caso de error
//---------------------------------------------------------------------------
int __fastcall TForm1::GetInterfaceInfo(void)
{
    typedef WINSOCK_API_LINKAGE int WSAAPI (*PFWSAIoctl)(SOCKET, DWORD,
            LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPWSAOVERLAPPED,
            LPWSAOVERLAPPED_COMPLETION_ROUTINE);

    WSADATA wsaData;
    if (WSAStartup(0x0002, &wsaData))
        return -1;

    // Como no indicas que versión de C++Builder usas
    //   cargamos dinámicamente la siguiente librería,
    //   si estas usando BCB5/6 puedes enlazarla estáticamente
    //   tienes ws2_32.lib en el subdirectorio ...\lib\Psdk
    HINSTANCE hLib = LoadLibrary("ws2_32.dll");
    if (!hLib)
        return -1;

    // Obtenemos la direccion de "WSAIoctl" dinamicamente
    PFWSAIoctl fWSAIoctl = (PFWSAIoctl)GetProcAddress(hLib, "WSAIoctl");
    if (!fWSAIoctl)
    {
        FreeLibrary(hLib);
        return -1;
    }

    int s = socket(AF_INET, SOCK_RAW, 0);
    DWORD dwBytesReturned;
    int n = fWSAIoctl(s, SIO_GET_INTERFACE_LIST, NULL, 0,
                      (LPVOID)&m_interfaceInfo, sizeof(m_interfaceInfo),
                      &dwBytesReturned, NULL, NULL);

    n = (dwBytesReturned > 0) ? dwBytesReturned / sizeof(INTERFACE_INFO) : 0;

    closesocket(s);
    FreeLibrary(hLib);
    WSACleanup();

    return n;
}

- Y finalmente el siguiente código en el OnClick del botón:
Código:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  ListBox1->Clear();
  int num = GetInterfaceInfo();
  for (int i=0; i<num; ++i)
  {
    String addr = inet_ntoa(m_interfaceInfo[i].iiAddress.AddressIn.sin_addr);
    String mask = inet_ntoa(m_interfaceInfo[i].iiNetmask.AddressIn.sin_addr);
    DWORD flags = m_interfaceInfo[i].iiFlags;

    ListBox1->Items->Add("Addr:  " + addr);
    ListBox1->Items->Add("Mask:  " + mask);
    ListBox1->Items->Add("Flags:"
        + String(flags & IFF_UP           ? " IFF_UP"           : "")
        + String(flags & IFF_BROADCAST    ? " IFF_BROADCAST"    : "")
        + String(flags & IFF_LOOPBACK     ? " IFF_LOOPBACK"     : "")
        + String(flags & IFF_POINTTOPOINT ? " IFF_POINTTOPOINT" : "")
        + String(flags & IFF_MULTICAST    ? " IFF_MULTICAST"    : "") );

    ListBox1->Items->Add("---");
  }
}


Conozco otras maneras de hacerlo, pero requieren de Windows 98 o superior.

Saludos:
 _Leo
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola Leo,he compilado el ejemplo y ala hora de compilar no me da ningun error pero cuando lo ejecuto sale una ventana de error.



No se encuentra el punto de entrada del procedimiento WahGetContext en la biblioteca de vinculos dinamicos WS2Help.dll.

cierro la ventana y el programa aborta y no sale nada,a que es devido esto he mirado a ver si tiene el systema la dll WS2Help y si la tiene,parece ser q esq no encuentra esa funcion,bueno a ver si me das una idea un saludo.

Manuel H.C.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola, yo lo he probado usando BCB4 y BCB6 en Windows 98/ME/XP y me funciona correctamente.

(Las pruebas que he hecho en Win98 y ME han sido sin instalar actualizaciones de ningún tipo, o sea, tal y como vienen de fabrica)

Que versión de C++Builder usas y en que versión de Windows te da ese error ?
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

De nuevo por aqui con el tema,yo esq alucino las cosas q se aprenden,resulta q lo cambie de directorio de donde lo compile y me funciona,ahhhhhhhhahhhhhhhh salto la idea no sera q esq sobra la dll q copie en el directorio del proyecto y efectivamente la borre y sono la flauta,yo esq la ws2_32.dll la habia copiado en el directorio del proyecto por si no la encontraba pero parece ser q la busca en el directorio del systema ,bueno una cosa mas q he aprendido gracias d todas formas y esto funciona,lo unico q meda la ip local pero yo uso router y no me da la q tengo con el servidor ¿seria posible de sacarla?,un saludo y gracias d nuevo.

Manuel H.C.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Perdona al final no te conteste,uso C++Builder 6 y Windows XP
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Aquí tienes otra manera de conseguir los datos. Tal como esta funciona en el BCB6 y en todas las versiones de Windows excepto el 95.

En otras versiones de C++Builder habría que cargar dinámicamente la dll necesaria o generar la librería de importación correspondiente y además crear las estructuras y tipos necesarios ya que el resto de versiones no trae las cabeceras necesarias, al menos desde el BCB4 para atrás, no recuerdo si el BCB5 ya las tenia actualizadas.

- Añadimos un TListBox (ListBox1) a nuestro proyecto y luego las lineas siguientes:
Código:
#include <iphlpapi.h>
// Corregir aquí la ruta segun donde tengamos instalado nuestro BCB
#pragma link "c:/borland/cbuilder6/lib/psdk/iphlpapi.lib"

- Y finalmente el siguiente código en el constructor del form:
Código:
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    IP_ADAPTER_INFO AdapterInfo[20], *pAdapterInfo;
    ULONG bufferLen = sizeof(AdapterInfo);

    pAdapterInfo = AdapterInfo;
    GetAdaptersInfo(pAdapterInfo, &bufferLen);

    while(pAdapterInfo)
    {
        String sName = pAdapterInfo->Description;
        String sIp   = pAdapterInfo->IpAddressList.IpAddress.String;
        String sMask = pAdapterInfo->IpAddressList.IpMask.String;

        ListBox1->Items->Add("Adaptador: " + sName);
        ListBox1->Items->Add("IP:        " + sIp);
        ListBox1->Items->Add("Mascara:   " + sMask);
        ListBox1->Items->Add("---");

        pAdapterInfo = pAdapterInfo->Next;
    }
}

Fíjate en la documentación de la función GetAdaptersInfo y la estructura IP_ADAPTER_INFO donde obtenemos más información de la que se muestra en el ejemplo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.