IcmpSendEcho führt nichts aus.
-
Hi,
mit dem folgenden Stück Quellcode versuche ich alle IPs in einem Bereich zu ermitteln und dann anzupingen. Wenn das Pingen zu Ende ist, soll die IP in die ListBox geschrieben werden (das alle IPs erzeugt werden weiß ich):GetDlgItemText(hWnd, IDC_AREASTART, szStart, 1024); GetDlgItemText(hWnd, IDC_AREAEND, szEnd, 1024); sscanf(szStart, "%i.%i.%i.%i", &ip1, &ip2, &ip3, &iStart); sscanf(szEnd, "%i.%i.%i.%i", &ip1, &ip2, &ip3, &iEnde); for (int i=iStart; i<=iEnde; i++) { char *szTemp = NULL; szTemp = new char[16]; hICMP = IcmpCreateFile(); sprintf(szTemp, "%i.%i.%i.%i", ip1, ip2, ip3, i); if (IcmpSendEcho(hICMP, (IPAddr) szTemp, szTemp, sizeof(szTemp), NULL, NULL, NULL, 2000) != 0) { SendMessage(GetDlgItem(hWnd, IDC_RESULTLIST), LB_ADDSTRING, 0, (int) szTemp); } IcmpCloseHandle(hICMP); } MessageBox(hWnd, "Scan abgeschlossen", "Hinweis", MB_OK | MB_ICONINFORMATION);
Doch direkt nach dem Klick auf das Control, dass das ganze Ausführen soll wird die MessageBox ausgegeben.
Hat da jemand eine Idee/Lösung?
-
Mach mal zu dem if noch ein else und Schreib dort z.B. GetLastError() in die Listbox
Falls nicht nur der letzte Block veränderlich ist findest du hier (ganz unten) einen Tipp von volkard
Schau dir auch nochmal die Parameter von IcmpSendEcho an - die sind bei dir glaub' nicht ganz richtig
-
Hi,
das mit der Fehlerausgabe habe ich gemacht, allerdings wird beim Ausführen mit einem Fehler unterbrochen.SendMessage(GetDlgItem(hWnd, IDC_RESULTLIST), LB_ADDSTRING, 0, GetLastError()); // Diese Zeile
Danke für diesen Tipp! Werde ich mal einbauen, wenn das ganze läuft.
Hm. Ich dachte eigentlich, dass ich das meiste mit NULL versehen könnte, weil ich ja eigentlich nur wissen will, ob hinter der IP ein Rechner sitzt.Chris
-
Und noch ein Problem:
Run-Time Check Failure #3 - The variable 'dwReplySize' is being used without being defined.
DWORD dwReplySize, dwTimeOut = 0; // ... if (IcmpSendEcho(hICMP, (IPAddr) szTemp, szTemp, sizeof(szTemp), NULL, &aReply, dwReplySize, dwTimeOut) != 0) {
Chris
-
Mit was für einem Fehler wird unterbrochen? Kannst du es Kompilieren?
btw: GetLastError() liefert ein DWORD - entweder unter System Error Codes selbst nachschauen, oder FormatMessage bemühenIch dachte immer, dass es explizit dran stehen muss, dass man auch NULL einsetzen darf, wenn man an den Infos nicht interessiert ist.
Dein dwReplySize ist nich initialisiert! Versuch's mal so:DWORD dwReplySize = 0, dwTimeOut = 0;
Seltsam finde ich in der Doku, dass die letzten beiden Parameter DWORDs sind (keine Pointer auf DWORD), aber trotzdem [out] dransteht
-
Hi,
danke. Habe das ganze mal ausprobiert und auch selber ein wenig mit Hilfe von anderen ein rumprobiert. Folgender Source ist derzeit einigermaßen Funktionsfähig:for (int i=iStart; i<=iEnde; i++) { char *szTemp = NULL; DWORD dwReplySize = sizeof(ICMP_ECHO_REPLY)*8; DWORD dwTimeOut = 8000; ICMP_ECHO_REPLY *aReply = new ICMP_ECHO_REPLY[64]; szTemp = new char[16]; hICMP = IcmpCreateFile(); sprintf(szTemp, "%i.%i.%i.%i", ip1, ip2, ip3, i); IPAddr ip; ip = inet_addr(szTemp); if (IcmpSendEcho(hICMP, (IPAddr) ip, szTemp, strlen(szTemp), NULL, &aReply, dwReplySize, dwTimeOut) != 0) { SendMessage(GetDlgItem(hWnd, IDC_RESULTLIST), LB_ADDSTRING, 0, (int) szTemp); } else { // SendMessage(GetDlgItem(hWnd, IDC_RESULTLIST), LB_ADDSTRING, 0, GetLastError()); /* * You have to uncomment this for checking IcmpSendEcho-Results. */ } IcmpCloseHandle(hICMP); delete [] aReply; }
Allerdings bricht er irgendwann ab mit einer AccessViolation. Ich denke, dass irgendwo noch ein Speicherleck ist. Das wird erstmal gesucht...
Chris
-
The buffer should be large enough to hold at least one ICMP_ECHO_REPLY structure plus MAX(RequestSize,
bytes of data since an ICMP error message contains 8 bytes of data.
Vielleicht hängts damit zusammen
Und für dwReplySize würd ich sizeof(aReply) ausprobieren
-
Hi flenders,
habe das gerade eingebaut, aber daran lag es leider nicht.Chris
-
Wo genau hängt er sich denn auf? (Edit: s.o.)
-
Hi,
ich habe gerade mal deine Änderung eingebaut (bzgl. sizeof(aReply);). Allerdings ist er beim Durchlaufen von 127.0.0.0 bis 127.0.0.3 direkt fertig, ohne ein Ergebnis. Das kann natürlich theoretisch nicht sein, weil er ja bei 127.0.0.1 was finden müsste, oder?Chris
PS: Er hängt sich in irgendeiner Funktion in irgendeiner Headerdatei auf. Ich glaube irgendwas mit dem Delete.
-
Ich hab mal gegoogled und bin häufiger auf folgendes gestoßen:
char reply[sizeof(icmp_echo_reply)+8]; IcmpSendEcho(hICMP, (IPAddr) ip, 0, 0,, NULL, reply,sizeof(icmp_echo_reply)+8,5000);
-
Wie gesagt: lass dir mal GetLastError ausgeben
-
Hi,
bei diesem Source bekomme ich:---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!Program: c:\Coden\C++\NetworkPing\Debug\NetworkPing.exe
File: dbgdel.cpp
Line: 51Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.(Press Retry to debug the application)
---------------------------
Abbrechen Wiederholen Ignorieren
---------------------------Das mit dem GetLastError hat mich jetzt auch nicht sehr viel weitergebracht: immer der Fehler, dass der Datenbereich zu klein sei...
Aber wie groß soll er dann sein? Und welcher ist jetzt gemeint?Chris
-
Die Fehlermeldung blick ich nicht
The buffer should be large enough to hold at least one ICMP_ECHO_REPLY structure plus MAX(RequestSize,
bytes of data since an ICMP error message contains 8 bytes of data.
-
Hi,
ich habe jetzt den Buffer vergößert, jetzt gibt es allerdings wieder den Abbruch in dem Header dbgdel.h in der Methode void operator delete.Chris
PS: GetLastError brachte nur was wie "Fenster hat keine Scrollelstein" hervor.
-
Was ist denn das überhaupt für ein Header
-
Ich habe KEINE Ahnung. Aber ich vermute, die ist für die delete-Operatoren zuständig.
Chris
-
Versuche doch einfach erstmal nur eine einzelne Adresse (z.B. 127.0.0.1) anzupingen - vielleicht kommst du ja so mal vorwärts
-
Hi,
immer noch der gleiche Fehler...Himmel, Ar*** und Zwirn! Das kann doch nicht so schwer sein!!!
Chris