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

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Sab 05 Jul, 2008 1:21 pm Asunto: Hacer Ping desde código |
|
|
Para hacer un Ping por código y saber si se ha tenido éxito, esta puede ser una solución.
Yo lo utilizo para comprobar que tengo conexión a internet haciendo un Ping a una página estable como google (64.233.187.99 ó 64.233.183.99) Puede cambiar. Puede calcularse la IP desde el Host con otra función no difícil de implementar, para calcular directamente desde cualquier URL.
Indudablemente este código puede tener muchas mas utilidades.
Las funciones están definidas en la cabecera icmpapi.h, dependiendo de vuestro compilador, es posible que dispongáis ya de la cabecera. El mio, C++Builder 5 no las tiene definidas.
Estas funciones están en la librería icmp.dll desde Windows NT y en el XP, ademas se puede acceder a ellas desde iphlpapi.dll. De forma que tendréis que preparar el compilador para que las linke.
Aquí esta la cabecera:
icmpapi.h
Para el que no disponga de ella, puede utilizar esta:
| Código: |
/*
* Interface to the ICMP functions.
*
* Copyright (C) 1999 Francois Gouget
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef __WINE_ICMPAPI_H
#define __WINE_ICMPAPI_H
#ifdef __cplusplus
extern "C" {
#endif
HANDLE WINAPI IcmpCreateFile(
VOID
);
BOOL WINAPI IcmpCloseHandle(
HANDLE IcmpHandle
);
DWORD WINAPI IcmpSendEcho(
HANDLE IcmpHandle,
IPAddr DestinationAddress,
LPVOID RequestData,
WORD RequestSize,
PIP_OPTION_INFORMATION RequestOptions,
LPVOID ReplyBuffer,
DWORD ReplySize,
DWORD Timeout
);
#ifdef __cplusplus
}
#endif
#endif /* __WINE_ICMPAPI_H */
|
| Código: | #include <vcl.h>
#include <winsock2.h>
#include <iphlpapi.h>
#include "icmpapi.h"
#pragma link "icmp.lib"
#pragma link "wininet.lib"
//------------------------------------------------------------------------------
// Copyright (C) Escafandra 2008
// Hacer Ping y conocer el resultado
// Entrada IP en formato 255.255.255.255
// Devuelve true si tiene exito o false si hubo un error.
//------------------------------------------------------------------------------
bool Ping(char* Addr, int NVeces)
{
//Formato de Addr NNN.NNN.NNN.NNN
//Declarar e inicializar variables
bool Result = true;
HANDLE hIcmpFile;
unsigned long ipaddr = INADDR_NONE;
DWORD dwRetVal = 0;
char SendData[] = "Data Buffer";
LPVOID ReplyBuffer = NULL;
DWORD ReplySize = 0;
//Obtener IP de Addr
ipaddr = inet_addr(Addr);
if (ipaddr == INADDR_NONE){
Result = false;
return Result;
}
hIcmpFile = IcmpCreateFile();
if (hIcmpFile == INVALID_HANDLE_VALUE) {
Result = false;
return Result;
}
ReplySize = sizeof(ICMP_ECHO_REPLY) + sizeof(SendData);
ReplyBuffer = (VOID*) malloc(ReplySize);
if (ReplyBuffer == NULL) {
Result = false; // No localizacion de memoria...
return Result;
}
// Envia Ping
Result = true;
for(int n=0; n<NVeces; n++){
Application->ProcessMessages();
dwRetVal = IcmpSendEcho(hIcmpFile, ipaddr, SendData, sizeof(SendData),
NULL, ReplyBuffer, ReplySize, 1000);
if (dwRetVal != 0) {
PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer;
// Detectar Error en Ping (IP_STATUS)
// ICMP_ECHO_REPLY Structure IP_STATUS code
// http://msdn2.microsoft.com/en-us/library/aa366053(VS.85).aspx
if(pEchoReply->Status != 0){
Result = false; // Error en Ping el Host no lo recibe....
}
}else{
Result = false; // Error en IcmpSendEcho localizar con GetLastError()
}
if(Result) break;
Sleep(1000);
}
free(ReplyBuffer);
return Result;
}
|
Saludos.
EDITO:
Vuelvo a editar el Código con los consejos de _Leo para que se vea correcto
Ultima edición por escafandra el Mar 15 Jul, 2008 7:07 pm, editado 2 veces |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Lun 14 Jul, 2008 12:48 pm Asunto: |
|
|
Trabajo con Builder 5 y tengo dos problemas con tu código.
1. El fichero icmpapi.h he tenido que crearlo; sin mayor problema. Ahora bien, a la hora de compilar me da dos errores:
| Cita: | [Linker Error] Unresolved external 'IcmpCreateFile' referenced from C:\ARCHIVOS DE PROGRAMA\BORLAND\CBUILDER5\BIN\UNIT1.OBJ
[Linker Error] Unresolved external 'IcmpSendEcho' referenced from C:\ARCHIVOS DE PROGRAMA\BORLAND\CBUILDER5\BIN\UNIT1.OBJ |
Ambas funciones están en dicho include y el mismo está en la misma carpeta que el cpp. ¿Por uqé puede ser el fallo?
2. En el código del cpp que has puesto me parece que hay un error en la declaración del for. Has puesto esto:
| Código: | for(int n=0; n<NVeces>ProcessMessages();
dwRetVal = IcmpSendEcho(hIcmpFile, ipaddr, SendData, sizeof(SendData),
NULL, ReplyBuffer, ReplySize, 1000); |
y creo que debería ser así:
| Código: | for(int n=0; n<NVeces; n ++)
{
ProcessMessages();
dwRetVal = IcmpSendEcho(hIcmpFile, ipaddr, SendData, sizeof(SendData),
NULL, ReplyBuffer, ReplySize, 1000); |
_________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Mar 15 Jul, 2008 2:01 am Asunto: |
|
|
| Angel escribió: | Trabajo con Builder 5 y tengo dos problemas con tu código.
|
Hola Angel. Yo tambión trabajo con Builder 5.
El fichero icmpapi.h es el que está arriba, no viene en Builder 5.
Debes linkar las librerías icmp.dll y wininet.dll, para lo que debes usar IMPLIB del builder para sacar las correspondientes icmp.lib y wininet.lib
Luego añades:
| Código: | #pragma link "icmp.lib"
#pragma link "wininet.lib" |
He tenido problemas para editar código en el editor de post, desaparecen cosas y se come líneas.
Como aparezca la palabra Application->ProcessMessages(); aparecen problemas en la edición.
el bucle es así:
| Código: | for(int n=0; n<NVeces; n++) |
Te paso de nuevo el código o lo publico en rapidshare.
| Código: | #include <vcl.h>
#include <winsock2.h>
#include <iphlpapi.h>
#include "icmpapi.h"
#pragma link "icmp.lib"
#pragma link "wininet.lib"
//------------------------------------------------------------------------------
// Copyright (C) Escafandra 2008
// Hacer Ping y conocer el resultado
// Entrada IP en formato 255.255.255.255
// Devuelve true si tiene exito o false si hubo un error.
//------------------------------------------------------------------------------
bool Ping(char* Addr, int NVeces)
{
//Formato de Addr NNN.NNN.NNN.NNN
//Declarar e inicializar variables
bool Result = true;
HANDLE hIcmpFile;
unsigned long ipaddr = INADDR_NONE;
DWORD dwRetVal = 0;
char SendData[] = "Data Buffer";
LPVOID ReplyBuffer = NULL;
DWORD ReplySize = 0;
//Obtener IP de Addr
ipaddr = inet_addr(Addr);
if (ipaddr == INADDR_NONE){
Result = false;
return Result;
}
hIcmpFile = IcmpCreateFile();
if (hIcmpFile == INVALID_HANDLE_VALUE) {
Result = false;
return Result;
}
ReplySize = sizeof(ICMP_ECHO_REPLY) + sizeof(SendData);
ReplyBuffer = (VOID*) malloc(ReplySize);
if (ReplyBuffer == NULL) {
Result = false; // No localizacion de memoria...
return Result;
}
// Envia Ping
Result = true;
for(int n=0; n<NVeces; n++){
Application->ProcessMessages();
dwRetVal = IcmpSendEcho(hIcmpFile, ipaddr, SendData, sizeof(SendData),
NULL, ReplyBuffer, ReplySize, 1000);
if (dwRetVal != 0) {
PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer;
// Detectar Error en Ping (IP_STATUS)
// ICMP_ECHO_REPLY Structure IP_STATUS code
// http://msdn2.microsoft.com/en-us/library/aa366053(VS.85).aspx
if(pEchoReply->Status != 0){
Result = false; // Error en Ping el Host no lo recibe....
}
}else{
Result = false; // Error en IcmpSendEcho localizar con GetLastError()
}
if(Result) break;
Sleep(1000);
}
free(ReplyBuffer);
return Result;
}
|
Bueno, he comprobado que una cosa es lo que pego y otra lo que se lee.
Lo subo a rapidshare. Te subo también un ejemplo de prueba con una versión previa del mismo código, este sólo hacía un sólo ping. La nueva versión realiza un bucle de varios ping. No te costará adaptar el ejemplo con el nuevo código.
http://rapidshare.com/files/116494500/Prueba_Ping.rar
http://rapidshare.com/files/129760579/Ping.rar
Espero que se solucionen los problemas de edición. Me pasó en otro post que creo que no llegué a publicar por los fallos del editor.
Espero que el código te funcione tan bien como a mi. Me voy unos días de vacaciones.
Saludos.
Ultima edición por escafandra el Vie 01 Ago, 2008 10:07 am, editado 2 veces |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 15 Jul, 2008 2:38 am Asunto: |
|
|
Hola escafandra:
| escafandra escribió: | | He tenido problemas para editar código en el editor de post, desaparecen cosas y se come líneas. |
No se si llegaste a leer el mensaje privado que te mande, supongo que no. Más o menos te decía que:
"Prueba a marcar la opción "Deshabilitar HTML en este mensaje" para que no confunda los "< >" con etiquetas HTML. También puedes deshabilitarlo para todos los mensajes en las opciones de tu perfil."
Saludos.
PD: Un ejemplo pegando tu código para que veas como sale:
| Código: | //------------------------------------------------------------------------------
// Copyright (C) Escafandra 2008
// Hacer Ping y conocer el resultado
// Entrada IP en formato 255.255.255.255
// Devuelve true si tiene exito o false si hubo un error.
//------------------------------------------------------------------------------
bool Ping(char* Addr, int NVeces)
{
//Formato de Addr NNN.NNN.NNN.NNN
//Declarar e inicializar variables
bool Result = true;
HANDLE hIcmpFile;
unsigned long ipaddr = INADDR_NONE;
DWORD dwRetVal = 0;
char SendData[] = "Data Buffer";
LPVOID ReplyBuffer = NULL;
DWORD ReplySize = 0;
//Obtener IP de Addr
ipaddr = inet_addr(Addr);
if (ipaddr == INADDR_NONE){
Result = false;
return Result;
}
hIcmpFile = IcmpCreateFile();
if (hIcmpFile == INVALID_HANDLE_VALUE) {
Result = false;
return Result;
}
ReplySize = sizeof(ICMP_ECHO_REPLY) + sizeof(SendData);
ReplyBuffer = (VOID*) malloc(ReplySize);
if (ReplyBuffer == NULL) {
Result = false; // No localizacion de memoria...
return Result;
}
// Envia Ping
Result = true;
for(int n=0; n<NVeces; n++){
Application->ProcessMessages();
dwRetVal = IcmpSendEcho(hIcmpFile, ipaddr, SendData, sizeof(SendData),
NULL, ReplyBuffer, ReplySize, 1000);
if (dwRetVal != 0) {
PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer;
// Detectar Error en Ping (IP_STATUS)
// ICMP_ECHO_REPLY Structure IP_STATUS code
// http://msdn2.microsoft.com/en-us/library/aa366053(VS.85).aspx
if(pEchoReply->Status != 0){
Result = false; // Error en Ping el Host no lo recibe....
}
}else{
Result = false; // Error en IcmpSendEcho localizar con GetLastError()
}
if(Result) break;
Sleep(1000);
}
free(ReplyBuffer);
return Result;
} |
|
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Mar 15 Jul, 2008 7:19 am Asunto: |
|
|
Ok. Gracias _Leo.
A la vuelta de vacaciones nos leemos.
Saludos |
|
| 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.
|