Einfachen Ping ausführen
-
Hallo zusammen,
ich versuche mit dem C++ Builder (RAD Studio) eine VCL-Anwendung zu erstellen, welche einen einfachen Ping ausführt.
Leider scheitert es immer.
main.cpp
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "main.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { TForm1::IdIcmpClient1->Host="google.de"; TForm1::IdIcmpClient1->ReceiveTimeout=1000; TForm1::IdIcmpClient1->Ping(); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- void __fastcall TForm1::IdIcmpClient1Reply(TComponent *ASender, const TReplyStatus *AReplyStatus) { TForm1::Memo1->Lines->Add(AReplyStatus->Msg); }
Hier kommt der Fehler "Socket-Fehler # 10040Nachricht zu lang."
Schreibe ich in Ping("google.de") bekomme ich zwar ein echo zurück jedoch hab ich eine Zugriffsverletzung beim beenden der Anwendung.
Komme nicht so wirklich dahinter an was es liegt, da es bei anderen (aus anderen Foren / Google) so funktioniert.
Indy Version 10.6.0.5040 / RAD Studio EX5
Freue mich auf eine Antwort.
-
Bei CBuilder 6 ging das so:
void __fastcall TForm1::IdIcmpClient1Reply(TComponent *ASender, const TReplyStatus &AReplyStatus) { AnsiString result; result = AReplyStatus.FromIpAddress + " time= " + IntToStr(AReplyStatus.MsRoundTripTime) +" bytes received: " + IntToStr(AReplyStatus.BytesReceived); Memo1->Lines->Add(result); }
Wirst halt UnicodeString verwenden müssen und -> statt . aber auf jeden Fall MsRoundTripTime.
Gruß myerscola
-
Danke für den Code myerscola!
Mit UnicodeString bekomme ich immer noch den Access-Fehler mit AnsiString gehts damit weiter:Also es poppt jetzt schon mal kein Fehler mehr auf. Immerhin, jedoch schließt er den Prozess nicht ab und ich muss den Prozess killen (STRG+F2) bzw. beim Release kommt Appcrash Meldung von Microsoft.
Ich hab jetzt noch mal nach dem Socket Fehler 10040 bei Windows geschaut (http://msdn.microsoft.com/de-de/library/windows/desktop/ms740668(v=vs.85).aspx).
Okay mithilfe von Google haben manche den Empfangbuffer gesetzt, klappt bei mir jedoch nicht außer das sich die Ladezeiten beim starten verlängern.Insofern ich nichts bei Ping(...) rein schreibe kommt weiterhin die "Socket-Fehlermeldung 10040 - Nachricht zu lang" aber das Programm schließt ohne Probleme.
Ich denke eigentlich liegt es nur an meinem String und dem Buffer. Dann könnte ich bestimmt auch den Wert innerhalb von Ping() weglassen und es müsste funktionieren.//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "main.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { UnicodeString HostValue; TByteDynArray HostValueLeng; HostValue="google.de"; HostValueLeng.set_length(sizeof(HostValue)); TForm1::IdIcmpClient1->ReceiveBuffer(HostValueLeng); TForm1::IdIcmpClient1->Host=HostValue; TForm1::IdIcmpClient1->ReceiveTimeout=5000; TForm1::IdIcmpClient1->Ping("google.de"); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Application->Terminate(); } //--------------------------------------------------------------------------- void __fastcall TForm1::IdIcmpClient1Reply(TComponent *ASender, const TReplyStatus *AReplyStatus) { AnsiString result; result = AReplyStatus->FromIpAddress + " time= " + IntToStr((int) AReplyStatus->MsRoundTripTime) +" bytes received: " + IntToStr(AReplyStatus->BytesReceived); TForm1::Memo1->Lines->Add(result); } //---------------------------------------------------------------------------
So lädt das Programm schneller, gleiches Problem:
void __fastcall TForm1::FormCreate(TObject *Sender) { UnicodeString HostValue; TByteDynArray HostValueLeng; HostValue="google.de"; //HostValueLeng.set_length(sizeof(HostValue)); //TForm1::IdIcmpClient1->ReceiveBuffer(HostValueLeng); TForm1::IdIcmpClient1->Host=HostValue; TForm1::IdIcmpClient1->ReceiveTimeout=5000; TForm1::IdIcmpClient1->Ping("google.de"); }
Vielleicht habt Ihr ja noch eine Idee...
-
Das ist offenbar ein Bug der ICMP-Komponente:
http://forums2.atozed.com/viewtopic.php?f=7&t=26564
-
Benutz´ einfach die Win32 Funktion
IcmpSendEcho
, so kompliziert ist das nicht. Im MSDN gibt´s zur Dokumentation der Funktion sogar ein Beispiel in C.