Como respuesta a una pregunta del foro y por no sobrecargar de C una pregunta hecha para delphi, publico aquí un ejemplo de como hacer un Ping desde código usando sólo la API. El parámetro recibido como IP debe ser eso, una dirección IP. Admite reperir el Ping n veces y devuelve el resultado como bool:
#pragma link "$(BCB)\\lib\\PSDK\\Wininet.lib" #pragma link "icmp.lib" #include <winsock2.h> #include <iphlpapi.h> #include "icmpapi.h" //--------------------------------------------------------------------------- // 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) + 64; 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 // [url]http://msdn2.microsoft.com/en-us/library/aa366053(VS.85).aspx[/url] 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.
PD. Me olvidaba comentar que icmp.lib es la librería obtenida con IMPLIB de icmp.dll. También debemos enlazar Wininet.lib (de Wininet.dll)
Así mismo, el archivo cabecera icmpapi.h no viene en alguna versión de Builder, los dejo aquí.
Subo todo el código y un ejemplo con fuentes y compilado.