A
Hi,
hab Fehler gefunden:
hatte wahrscheinlich diese Zeile:
return ilRetVal = ilCount ? ilTimeSum/ilCount : -1;
falsch umgesetzt!
Hier noch mal mein kompletter Code:
// Ping senden
int time;
AnsiString slAddress = "www.c-plusplus.net";
// Definition der IP-Optionenstruktur
typedef struct tagIPINFO
{
BYTE bTimeToLive; // Time To Live
BYTE bTypeOfService; // Type Of Service
BYTE bIpFlags; // IP-Flags
BYTE OptSize; // Grösse der Options Data Buffers
BYTE FAR *Options; // Zeiger auf Options Data Buffer
} IPINFO, *PIPINFO;
// Definition der ICMP-Echo Antwortstruktur
typedef struct tagICMPECHO
{
DWORD dwSource; // Zieladresse
DWORD dwStatus; // IP-Status
DWORD dwRTTime; // Round Trip Time in Millisekunden
WORD wDataSize; // Grösse des Antwort-Buffers
WORD wReserved;
void FAR *pData; // Zeiger auf die Antwort-Daten
IPINFO ipInfo; // Antwort-Optionen
} ICMPECHO, *PICMPECHO;
// Zeiger auf die Funktionen aus der ICMP.DLL deklarieren, für PING:
typedef HANDLE (WINAPI *PF_CMPCREATEFILE)(VOID);
typedef BOOL (WINAPI *PF_ICMPCLOSEHANDLE)(HANDLE);
typedef DWORD (WINAPI *PF_ICMPSENDECHO)(HANDLE,DWORD,LPVOID,WORD,
PIPINFO,LPVOID,DWORD,DWORD);
// ICMP.DLL laden:
HANDLE hIcmp = LoadLibrary("ICMP.DLL");
if(hIcmp == NULL)
{
ShowMessage("Could not load ICMP.DLL");
time = -1;
}
else
{
// Zeiger auf die Funktionen besorgen:
PF_CMPCREATEFILE pfIcmpCreateFile = (PF_CMPCREATEFILE)
GetProcAddress(hIcmp, "IcmpCreateFile");
PF_ICMPCLOSEHANDLE pfIcmpCloseHandle = (PF_ICMPCLOSEHANDLE)
GetProcAddress(hIcmp,"IcmpCloseHandle");
PF_ICMPSENDECHO pfIcmpSendEcho = (PF_ICMPSENDECHO)
GetProcAddress(hIcmp,"IcmpSendEcho");
// Funktionszeiger prüfen:
if (pfIcmpCreateFile == NULL || pfIcmpCloseHandle == NULL ||
pfIcmpSendEcho == NULL)
{
ShowMessage("Error getting ICMP proc address");
FreeLibrary(hIcmp);
time = -1;
}
else
{
// WinSock initialisieren
WSADATA wsaData;
int ilRetVal = WSAStartup(0x0101, &wsaData );
if(ilRetVal)
{
ShowMessage("Winsock-Initialsierungsfehler: " + IntToStr(ilRetVal));
WSACleanup();
FreeLibrary(hIcmp);
time = -1;
}
// Check WinSock version
if(0x0101 != wsaData.wVersion)
{
ShowMessage("Fehler: Winsock Version 1.1 oder höher nicht vorhanden !");
WSACleanup();
FreeLibrary(hIcmp);
time = -1;
}
else
{
// Prüfen, ob es sich bei der Zieladresse um IP-Adresse handelt und
// ggf. den die Adresse zum Namen ermitteln:
struct in_addr iaDest; // Struktur für die Internet-Adresse
iaDest.s_addr = inet_addr(slAddress.c_str());
LPHOSTENT pHost; // Zeiger auf die Host Entry Struktur
if (iaDest.s_addr == INADDR_NONE) pHost = gethostbyname(slAddress.c_str());
else pHost = gethostbyaddr((BYTE *)&iaDest, sizeof(struct in_addr), AF_INET);
if(pHost == NULL)
{
ShowMessage("Fehler: Adresse " + slAddress + " wurde nicht gefunden !");
WSACleanup();
FreeLibrary(hIcmp);
time = -1;
}
else
{
// IP-Adresse kopieren
DWORD* pAddress = (DWORD*)(*pHost->h_addr_list);
// ICMP Echo Request Handle besorgen:
HANDLE hIcmpFile = pfIcmpCreateFile();
ICMPECHO icmpEcho; // ICMP-Echo Antwortbuffer
IPINFO ipInfo; // IP-Optionenstruktur
// Default-Werte festlegen:
::ZeroMemory(&ipInfo, sizeof(ipInfo));
ipInfo.bTimeToLive = 255;
// ICMP Echo anfordern:
pfIcmpSendEcho(hIcmpFile, *pAddress, NULL, 0, &ipInfo, &icmpEcho,
sizeof(struct tagICMPECHO), 5000);
// Ergebnisse:
iaDest.s_addr = icmpEcho.dwSource;
// falls Fehler aufgetreten:
if(icmpEcho.dwStatus)
{
ShowMessage("Fehler: IcmpEcho-Status=" + IntToStr(icmpEcho.dwStatus));
time = -1;
}
// Echo-Request File Handle schliessen:
pfIcmpCloseHandle(hIcmpFile);
// ICMP.DLL freigeben:
FreeLibrary(hIcmp);
// Winsock schliessen:
WSACleanup();
// Fehler?
time = icmpEcho.dwRTTime;
}
}
}
}
ShowMessage(time);
Bleibt nur noch die Frage, wie ich einen Ping an www.freesql.org senden kann? Oder wie ich sonst herausbekomme ob diese Seite erreichbar ist?
Danke
Alexander Sulfrian
Edit: Code-Tags berichtigt
[ Dieser Beitrag wurde am 15.04.2003 um 19:23 Uhr von Alexander Sulfrian editiert. ]