Entwickler-Ecke
Internet / Netzwerk - Ping/IcmpSendEcho und SendARP funktionieren nicht mehr
thomaskroger - Do 08.03.12 15:21
Titel: Ping/IcmpSendEcho und SendARP funktionieren nicht mehr
Hallo,
folgender Code funktionierte eine Zeitlang auf Delphi 7 und Windows 7.
Doch auf einmal geht nichts mehr.
Ein Ping, also die Fkt "IcmpSendEcho" wird mit korrekten Parametern aufgerufen aber kommt ohne Timeout, also sofort mit dem Ergebnis 0 zurück, also ohne.
Der Ping vom cmd-Fenster aus geht.
Auch wenn ich mein Delphi-Programm als Admin ausführe, geht "IcmpSendEcho" nicht.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| uses ping, WinSock;
RTT := Ping.Execute('192.168.2.241',1000);
...
IPv4: in_addr; Timeout: Word; Handle: THandle; ReplyBuffer: array[0..MAX_ECHO_REPLY] of TIcmpEchoReply; ReplyCount,i: Integer;
ReplyCount := IcmpSendEcho(Handle, IPv4, NIL, 0, NIL, @ReplyBuffer[0], SizeOf(ReplyBuffer), Timeout); |
danach ist ReplyCount:=0
Das gleich mit folgendem Code zum Ermitteln der MAC:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| uses WinSock;
function SendARP (DestIp: DWORD; srcIP: DWORD; pMacAddr: pointer; PhyAddrLen: Pointer): DWORD;stdcall; external 'iphlpapi.dll';
res,dwRemoteIP: cardinal; PhyAddrLen: Longword; pMacAddr : array [0..1] of Longword;
dwRemoteIP := cardinal(inet_addr(PChar(address))); ... res:=SendARP(dwremoteIP, 0, @pMacAddr, @PhyAddrLen); |
danach ist res:=1 (NO_ERROR ist :=0)
"SendARP" gibt keinen korrekten Wert zurück.
Ich habe in der Zwischenzeit eine Menge geändert aber nicht innerhalb der nun toten Funktionen.
Welcher Seiteneffekt kann das sein?
Martok - Do 08.03.12 21:14
Die Wrapper-Funktionen von Windows versuche ich immer zu vermeiden, hat man nur Ärger mit ;)
Was sagt GetLastError und (falls die da Gültigkeit hat) WSAGetLastError?
Funktionierts auf anderen Rechnern?
Ist eventuell eine Firewall im Weg, die die Requests direkt abbricht?
thomaskroger - Fr 09.03.12 18:34
Die Funktionen ergeben folgende GetLastError_Ergebnisse:
Delphi-Quelltext
1: 2: 3: 4: 5:
| res:=SendARP(dwremoteIP, 0, @pMacAddr, @PhyAddrLen); ShowMessage('GetLastError:'+IntToStr(GetLastError)+':'+SysErrorMessage(GetLastError));
RTT:=Ping.Execute(EditIP.Text, StrToInt(EditTimeout.text)); ShowMessage('GetLastError:'+IntToStr(GetLastError)+':'+SysErrorMessage(GetLastError)); |
Auf dem Entwicklungsrechner mit Windows 7 und IPHLPAPI.DLL vom 03.10.2003:
Mit GetLastError und WSAGetLastError gleich:
________________
res:=SendARP:
GetLastError=0=der Vorgang wurde erfolgreich beendet
res=1 (ERROR_INVALID_FUNCTION)
________________
RTT:=Ping.Execute:
RTT=-2 (Systemfehler)
das heißt in der unit ping:
ReplyCount:=IcmpSendEcho(bla..) gibt 0 zurück, also noReply und
GetLastError=1=unzulässige Funktion (ERROR_INVALID_FUNCTION))
________________
Auf dem Testrechner mit Windows XP funktionieren beide Funktionen problemlos!
Ping.Execute kümmert sich wenig um Timeout unter 1000ms, es dauert immer mindestens etwa 500ms.
"ZoneAlarm" ist komplett ausgestellt.
"arp -a" zeigt die korrekten IPs und MACs.
Was hat sich auf dem Windows7-PC verändert da das Ping.Execute einmal schon funktionierte?
bummi - Fr 09.03.12 18:51
Was ist wenn Du das Programm als Administrator ausführst?
thomaskroger - Fr 09.03.12 20:23
Auch als Admin ist das Problem unverändert. Ich habe den Eindruck, es ist außerhalb von Delphi im Windows-System zu suchen da ja schon die APIs durchfallen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!