 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Mie 23 Sep, 2015 9:03 pm Asunto: Como saber si tengo LAN o WLAN |
|
|
Estoy ya cansado de buscar y no encuentro nada.
Como puedo saber si un PC tiene conectada el CABLE RJ45 (RED) si no tiene Internet en el PC.
La cosa es que quiero detectar si a un cliente se le puede acceder por ESCRITORIO REMOTO, para lo cual se necesita la conexión cableada de RED, ya que la Wi-Fi si la tuviese no vale para la conexión.
GRACIAS DE ANTEMANO. _________________ Muchos hombres no se equivocan jamás porque no se proponen nada razonable. |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Mie 23 Sep, 2015 10:14 pm Asunto: |
|
|
Supongo que eso lo quieres saber por código y el el PC del cliente, para ello se me ocurre que primero debes conocer si está conectado por wifi, para ello puedes seguir este hilo: Jugando con las conexiones Wifi, en caso de que tenga conexión wifi la desconectas y miras si hay conexión a internet. El problema lo puedes tener si está conectado por cable a un punto e acceso wifi, eso va a ser mucho más difícil de conocer.
Saludos. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Jue 24 Sep, 2015 9:17 am Asunto: Re: Como saber si tengo LAN o WLAN |
|
|
| JesúsGandia escribió: | | La cosa es que quiero detectar si a un cliente se le puede acceder por ESCRITORIO REMOTO, para lo cual se necesita la conexión cableada de RED, ya que la Wi-Fi si la tuviese no vale para la conexión. |
Yo usop conexiones wifi para utilizar un escritorio remoto. No sé con que programa está intentando acceder, pero yo uso TeamViewer con wifi sin problemas. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Jue 24 Sep, 2015 9:52 pm Asunto: |
|
|
Creo que no me he explicado bien.
Mis clientes utilizas Comanderos (Android/iPads) para conectarse al SERVIDOR por ESCRITORIO REMOTO en modo MULTI-USUARIO/MULTI-ESCRITORIO.
Este proceso solo se pude hacer a través de un P.A. o Router y los dispositivos móviles se conectar por Wi-Fi al Router/P.A y éste a de estar conectado al PC por CABLE.
Quiero que mi Software pueda detectar sin yo estar delante del PC del cliente, si este tiene la conexión de RED u Internet por LAN o por WAN.
...y no vale decir... mira si el cliente tiene Wi-Fi porque si estubiense delante del PC, entonces no haría la pregunta que hago.
Windows cuando se conecta a la RED si es LAN, en la barra de tareas pone un pequeño PC y si si se desconecta el cable de RED pone una CRUZ y si no tiene internet pone un SIMBOLO DE advertencia en amarillo.
Pero cuando se conecta por Wi-Fi pone otro SIMBOLO con rallitas de cobertura.
Pues bién, si Windows puede detectar eso, seguro que con la función adecuada yo también y eso es lo que quiero encontrar.
Saber si el cliente tiene LAN o WAN sin yo estar allí.
GRACIAS. _________________ Muchos hombres no se equivocan jamás porque no se proponen nada razonable. |
|
| Volver arriba |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Jue 24 Sep, 2015 10:21 pm Asunto: |
|
|
| JesúsGandia escribió: | Creo que no me he explicado bien.
Mis clientes utilizas Comanderos (Android/iPads) para conectarse al SERVIDOR por ESCRITORIO REMOTO en modo MULTI-USUARIO/MULTI-ESCRITORIO.
Este proceso solo se pude hacer a través de un P.A. o Router y los dispositivos móviles se conectar por Wi-Fi al Router/P.A y éste a de estar conectado al PC por CABLE.
Quiero que mi Software pueda detectar sin yo estar delante del PC del cliente, si este tiene la conexión de RED u Internet por LAN o por WLAN.
...y no vale decir... mira si el cliente tiene Wi-Fi porque si estubiense delante del PC, entonces no haría la pregunta que hago.
Windows cuando se conecta a la RED si es LAN, en la barra de tareas pone un pequeño PC y si si se desconecta el cable de RED pone una CRUZ y si no tiene internet pone un SIMBOLO DE advertencia en amarillo.
Pero cuando se conecta por Wi-Fi pone otro SIMBOLO con rallitas de cobertura.
Pues bién, si Windows puede detectar eso, seguro que con la función adecuada yo también y eso es lo que quiero encontrar.
Saber si el cliente tiene LAN o WLAN sin yo estar allí.
GRACIAS. |
_________________ Muchos hombres no se equivocan jamás porque no se proponen nada razonable. |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Jue 24 Sep, 2015 11:28 pm Asunto: |
|
|
No explicaste en profundidad los motivos por los que quieres detectar una conexión por Wifi contra una LAN pero si entendí bien la pregunta.
1. La API InternetGetConnectedState te permite conocer si tienes conectado un cable de red a tu tarjeta, para ello basta que compruebes que en el Flag incluye el valor INTERNET_CONNECTION_LAN, una simple operación and binaria te lo dirá.
2. El hecho de que estés conectado o no por wifi o por cable, no te garantiza que sepas que dispones de conexión efectiva a Internet, es por eso que te dejé el enlace Saber si hay conexión de internet, donde describo una función: Webing que se conecta a una url real, como apuntaba mamcx, yo prefiero la conexión a google.com por su estabilidad, pero puede ser la misma de microsoft. Eso te garantiza que la conexión es real y funcionante. No hay ninguna API que te haga esa labor con seguridad. En ese enlace, si lo leiste, describo como usar la función a través de un proxy.
3. Pueden coexistir una LAN y una WAN, por lo que lo mejor es apagar la WAN para asegurarte que la conexión será por cable, es por eso que te dejé el enlace [URL="http://delphiaccess.com/foros/index.php/topic/11718-jugando-con-las-conexiones-wifi/"]Jugando con las conexiones Wifi[/URL], en el muestro como escanear redes wifi, saber a las redes a las que el PC está conectado por esa vía y la intensidad de señal (las barritas que comentas) conectarte y desconectarte, si bien el código está escrito en delphi, te dejo su equivalente en C, pues intuyo que te interesa más. La función desconecta todos los interfeces wifi disponibles en el equipo:
| Código: |
BOOL WifiDisConect()
{
HANDLE hClient;
DWORD dwVersion;
PWLAN_INTERFACE_INFO_LIST pInterfaceInfoList;
PGUID pInterfaceGuid;
BOOL Result = false;
if(ERROR_SUCCESS == WlanOpenHandle(1, NULL, &dwVersion, &hClient)){
if(ERROR_SUCCESS == WlanEnumInterfaces(hClient, NULL, &pInterfaceInfoList)){
for(int i=0; i < pInterfaceInfoList->dwNumberOfItems; i++){
pInterfaceGuid = &pInterfaceInfoList->InterfaceInfo[pInterfaceInfoList->dwIndex].InterfaceGuid;
Result = (ERROR_SUCCESS == WlanDisconnect(hClient, pInterfaceGuid, NULL));
}
WlanFreeMemory(pInterfaceInfoList);
}
WlanCloseHandle(hClient, NULL);
}
return Result;
}
|
4. Si tu PC se conecta por cable a un punto de acceso wifi es posible que lo tengas más difícil.
Estoy convencido de que con la información ofrecida serás capaz de conseguir tu objetivo.
Saludos. |
|
| Volver arriba |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Vie 25 Sep, 2015 11:16 am Asunto: |
|
|
intento hacer esto y no compila:
| Código: |
DWORD result;
if(!::InternetGetConnectedState(&result, 0))
throw GetLastError();
bool conexion = result & INTERNET_CONNECTION_LAN; |
Me da error "Unresolved external 'InternetGetConnectedSate' referenced from xxx.OBJ"
y no sé como resolverlo...
Necesito ayuda... GRACIAS. _________________ Muchos hombres no se equivocan jamás porque no se proponen nada razonable. |
|
| Volver arriba |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Vie 25 Sep, 2015 1:07 pm Asunto: |
|
|
Ok, ya está, perdona...
Me faltaba linkar la librería. _________________ Muchos hombres no se equivocan jamás porque no se proponen nada razonable. |
|
| Volver arriba |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Vie 25 Sep, 2015 1:27 pm Asunto: |
|
|
Pues después de probar esto: | Código: |
DWORD result;
InternetGetConnectedState(&result, 0);
if(result & INTERNET_CONNECTION_LAN)
LRed->Caption = "CABLE CONECTADO.";
else
LRed->Caption = "CABLE DES_CONECTADO.";
Application->ProcessMessages(); |
Si tengo el CABLE DESCONECTADO, pero tengo un USB Wi-Fi conectado, me dice que la LAN está conectada.
Vamos, que no encuentro lo que yo quiero.
¿Sabeis si por el REGISTRO DE WINDOWS puedo saber si un PC utiliza Tarjeta de RED CABLEADA o por el contrario algún tipo de interfaz Wi-Fi?
Por otro lado la función WifiDisConect()
No me consigue copilar aun añadiendo (wininet.dll, wininet.lib, wlanapi.dll, wlanapi.lib) _________________ Muchos hombres no se equivocan jamás porque no se proponen nada razonable. |
|
| Volver arriba |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Vie 25 Sep, 2015 4:07 pm Asunto: |
|
|
Gracias, ya encontré la solución.
| Código: |
//Función para comprobar si existe una conexión Wi-Fi
//Es necesario (#include "Wlanapi.h") y linkar la libreria Wlanapi.lib con el proyecto
void __fastcall TfrmComprobacion::EstadoWifi(void)
{
HANDLE hClient;
DWORD dwVersion;
PWLAN_INTERFACE_INFO_LIST pIfList = NULL;
PWLAN_INTERFACE_INFO pIfInfo = NULL;
PGUID pInterfaceGuid;
LWiFi->Font->Color = clRed;
LWiFi->Caption = "Desactivada y/o Desconectada";
if(ERROR_SUCCESS == WlanOpenHandle(1, NULL, &dwVersion, &hClient))
{
if(ERROR_SUCCESS == WlanEnumInterfaces(hClient, NULL, &pIfList))
{
for(unsigned int i=0; i <pIfList>dwNumberOfItems; i++)
{
pInterfaceGuid = &pIfList->InterfaceInfo[pIfList->dwIndex].InterfaceGuid;
pIfInfo = (WLAN_INTERFACE_INFO *) &pIfList->InterfaceInfo[i];
switch(pIfInfo->isState)
{
case wlan_interface_state_not_ready:
LWiFi->Caption = "No está listo.";
break;
case wlan_interface_state_connected:
LWiFi->Font->Color = clLime;
LWiFi->Caption = "Conectado.";
break;
case wlan_interface_state_ad_hoc_network_formed:
LWiFi->Caption = "Probando configuración automática.";
break;
case wlan_interface_state_disconnecting:
LWiFi->Caption = "Desconectando.";
break;
case wlan_interface_state_disconnected:
LWiFi->Caption = "Desconectado.";
break;
case wlan_interface_state_associating:
LWiFi->Caption = "Asociandose a la RED.";
break;
case wlan_interface_state_discovering:
LWiFi->Caption = "Probando configuración de RED.";
break;
case wlan_interface_state_authenticating:
LWiFi->Caption = "Procesando autenticación.";
break;
default:
LWiFi->Caption = "Estado desconocido.";
break;
}
}
WlanFreeMemory(pIfList);
}
WlanCloseHandle(hClient, NULL);
}
}
|
_________________ Muchos hombres no se equivocan jamás porque no se proponen nada razonable. |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Vie 25 Sep, 2015 4:54 pm Asunto: |
|
|
Supongo que ya puedes compilar el código que te pasé. En caso contrario y si te interesa, esta noche cuando llegue a casa, te preparo un ejemplo que muestre si hay conexiones wifi y desactivarlas.
Si la conexión wifi te crea un conflicto deberás desactivarla. comprobar que sigues teniendo conexión a internet y darle paso a tu sistema. Lo de la conexión a internet no estoy seguro que lo precises pues no se si tu aplicación es sólo para la red local.
Tienes vario funciones de código para wifi en el enlace que te dejé.
Saludos. |
|
| Volver arriba |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Vie 25 Sep, 2015 5:26 pm Asunto: |
|
|
GRACIAS, escafandra, tu función me sirvió de mucho, pero la modifique a mis necesidades.
Como tu bien dices podría una vez comprabado que tengo Wi-Fi descativarlo, cosa que haces con:
| Código: |
Result = (ERROR_SUCCESS == WlanDisconnect(hClient, pInterfaceGuid, NULL)); |
Lueg comprobar si tengo acceso a internet para saber si tengo conexión de RED.
Para este ultimo caso empleo la lectura de un fichero en la web por ftp, y en función de lo que tarde se si tiene cable conectado o NO.
Te muestro la función que ya esta comprobad y funciona perfectamente.
| Código: |
void __fastcall TfrmComprobacion::ComprobarInternet(void)
{
IdFTP->Host = CrDat(L"ÀÒÖˆÐÏÕÓÇÊ‹ÕßÕÒÃËÕˆÃÕ");//Texto encriptado
IdFTP->Username = CrDat(L"Ó’‘¾“——");//Texto encriptado
IdFTP->Password = CrDat(L"–”——ìë”–––”¾¸”åÖ¸–—¾—Â");//Texto encriptado
String UpdateLocal = fV->SV->DatSetPCRutaTPV_Ncr + CrDat(L"óÖÂÇÒÃúúÈÜÑ");//Texto encriptado
String VersionDescarga = fV->SV->DatSetPCRutaTPV_Ncr + CrDat(L"óÖÂÇÒÃ") + L"//version_update";//Texto encriptado
if(!DirectoryExists(fV->SV->DatSetPCRutaTPV_Ncr + CrDat(L"óÖÂÇÒÃ")))//Texto encriptado
CreateDir(fV->SV->DatSetPCRutaTPV_Ncr + CrDat(L"óÖÂÇÒÃ"));//Texto encriptado
// Creo variables de Proceso
double seg;
LARGE_INTEGER start, end, freq;
SetThreadAffinityMask(GetCurrentThread(), 1);
QueryPerformanceFrequency(&freq);
// Inicio Proceso Contador
QueryPerformanceCounter(&start);
try
{
IdFTP->Connect();
if(IdFTP->Connected())
{
IdFTP->ChangeDir(CrDat(L"ÈÜÑ"));//Texto encriptado
PBConexionInternet->MaxValue = (IdFTP->Size("version_actual") + IdFTP->Size(CrDat(L"ÈÜÑ"))) / 1024;//Texto encriptado
IdFTP->TransferType = ftASCII;
IdFTP->Get("version_update" , VersionDescarga, true);
IdFTP->Get(CrDat(L"ÈÜÑ") , UpdateLocal, true);//Texto encriptado
IdFTP->Disconnect();
IdFTP->Tag = 1;//Para saver si ha tenido exito hasta aquí
fV->SV->AccesoInternet = 1;//Tengo conexión a Internet
//Encripto el fichero bajado
TStringList* cLineas = new TStringList();
cLineas->LoadFromFile(VersionDescarga.w_str());//Cargo el contenido del fichero de versión
fV->SV->VersionUpdate = cLineas->Strings[0];//Capturo la primera Linea del fichero
cLineas->LoadFromFile(UpdateLocal.w_str());//Cargo el contenido del fichero con seriales problematicos
for(int i = 0; i <cLineas>Count; i++)//Con el bucle, encripto todo el fichero
cLineas->Strings[i] = CrDat(cLineas->Strings[i]);
cLineas->SaveToFile(UpdateLocal.w_str());//Lo guardo encriptado en el disco Local
delete cLineas;
LRed->Font->Color = clLime;
LAccesoInternet->Font->Color = clLime;
LRed->Caption = "Conexión establecida.";
LAccesoInternet->Caption = "Conexión establecida.";
EstadoWifi();
CB2->Enabled = true;
if(LWiFi->Caption == "Conexión establecida.")
{
CB2->Checked = true;
CB2->Font->Color = clRed;
}
else
CB2->Checked = true;
CB3->Enabled = true;
CB3->Checked = true;
CB4->Enabled = true;
CB4->Checked = true;
CB5->Enabled = true;
CB5->Checked = true;
CB6->Enabled = true;
CB6->Checked = true;
CB7->Enabled = true;
CB7->Checked = true;
CB8->Enabled = true;
CB8->Checked = true;
CB9->Enabled = true;
CB9->Checked = true;
}
}
catch(...)
{
if(!IdFTP->Tag)//Si es igual a CERO es que algo ha ido mal.
fV->SV->AccesoInternet = 0;//Si tengo conexión a Internet
LAccesoInternet->Font->Color = clRed;
LAccesoInternet->Caption = "Sin Acceso a Internet";
LWiFi->Font->Color = clRed;
LWiFi->Caption = "Desactivada y/o Desconectada";
QueryPerformanceCounter(&end);
seg = (end.QuadPart-start.QuadPart)/static_cast<double>(freq.QuadPart);
if(seg < 5)//Si tarda mas de 5 segundos no tengo tarjeta de RED o el cable está desconectado
{
LRed->Font->Color = clRed;
LRed->Caption = "Desactivada y/o Desconectada";
}
else//Si tarda mas de 5 segundos tengo tarjeta de RED con cable conectado, pero sin Acceso a Internet
{
LRed->Font->Color = TColor(33023);//Naranja
LRed->Caption = "Conectado a la Red sin Internet";
CB2->Enabled = true;
CB2->Checked = true;
}
PBConexionInternet->UserValue = PBConexionInternet->MaxValue;
}
} |
_________________ Muchos hombres no se equivocan jamás porque no se proponen nada razonable. |
|
| Volver arriba |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Vie 25 Sep, 2015 6:03 pm Asunto: Re: Como saber si tengo LAN o WLAN |
|
|
| Angel escribió: | | JesúsGandia escribió: | | La cosa es que quiero detectar si a un cliente se le puede acceder por ESCRITORIO REMOTO, para lo cual se necesita la conexión cableada de RED, ya que la Wi-Fi si la tuviese no vale para la conexión. |
Yo usop conexiones wifi para utilizar un escritorio remoto. No sé con que programa está intentando acceder, pero yo uso TeamViewer con wifi sin problemas. |
TeamViewer no es un RDP. _________________ Muchos hombres no se equivocan jamás porque no se proponen nada razonable. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|