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;
// ICMP-Echo-API-Wrapper (Ping) für Delphi V1.04 vom 08.09.2011, (C) by Narses

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,
                                   NIL0,
                                   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;

//external:
function SendARP (DestIp: DWORD; srcIP: DWORD; pMacAddr: pointer; PhyAddrLen: Pointer): DWORD;stdcallexternal 'iphlpapi.dll';


  res,dwRemoteIP: cardinal;
  PhyAddrLen: Longword;
  pMacAddr : array [0..1of 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.