![]() |
Überprüfen ob ein 'Server' online ist
Wie kann ich mit Delphi überprüfen, ob ein Server ( IP = DynDNS -> z.b. arm1.ath.cx) online oder offline ist. Ohne Delphi würde ich die Konsole öffnen und eingeben : ping arm1.ath.cx wenn ich antworten bekommen so ist der SErver online, wenn nicht ist er offline. In Delphi möchte ich aber haben das wenn ich auch einen Button ('Check') drücke, Delphi selbst überprüfft ob der Server online/offline ist. Das Ergebnis soll dann in einem Label erscheinen.
Ich habe noch nie Netzwerk Programmierung gemacht und weiß auch gar nicht mit was ich da anfagen soll, welche Komponenten ich überhaupt da benutzen sollte. Meine 2te Frage hat eig. mit Netzwerken nix zu tun: Wie kann ich mithilfe von Delphi ein anderes Programm mit 'Startparametern' starten? D.h. ich geb den Pfad der Exe Datei in ein Edit-Feld ein, und Delphi startet die Exe mit Startparametern. Konkretes Beispiel: Ich geb den Pfad von Call of Duty 4 ein, und wenn ich auf z.b: connect drücke, so wird die Exe mit folgenden Startparametern ausgeführt: +connect IP. So starte ich das Spiel und connecte sofort zu einem Server ohne vorher in das Hauptmenü des Spiels zu kommen. Wäre sehr dankbar wenn mir jemand helfen könnte :-D |
Re: Überprüfen ob ein 'Server' online ist
Genau so wie "per Hand": Du nimmst eine Ping-Komponente der ICS oder von Indy oder von ... und pinst deinen Server an.
|
Re: Überprüfen ob ein 'Server' online ist
Zitat:
Wobei Du in dem konkreten Fall bitte erstmal hier in der DP nach ![]() |
Re: Überprüfen ob ein 'Server' online ist
also meine 2te FRage habe ich gelöst funktionier wunderbar :D
Nur der erste Teil, also eine IP anpingen, da weiß ich immer noch nicht wie ich vorgehen muss, welche Komponente ich genau benutzen soll, und wie ich das ergebnis auswerten kann o.O |
Re: Überprüfen ob ein 'Server' online ist
Zitat:
![]() |
Re: Überprüfen ob ein 'Server' online ist
einfach eine kleine Datei runterzuladen ginge nicht?
|
Re: Überprüfen ob ein 'Server' online ist
hmm also wenn ich versuch die ICS datei (IcsDel110.dproj) zu installieren kommt bei mir folgender fehler bei der datei wsocket.pas zeile 2336:
Delphi-Quellcode:
if not WSocketGForced then begin
WSocketGForced := TRUE; // Der Linken Seite kann nix zugewiesen werden ;( Inc(WSocketGCount); WSocketGetProc(''); end; Das kann aber glaube ich daran liegen das ich Delphi 2009 benutze oder? Gibt es eine Alternative zu ICS und anpingen? |
Re: Überprüfen ob ein 'Server' online ist
Wenn ein Ping erfolgreich war, heißt das aber noch lange nicht, ob die benötigten Dienste (http, ftp, ..) auch verfügbar sind.
|
Re: Überprüfen ob ein 'Server' online ist
Also wenn Ping geht, dann ist ja der andere PC im Internet oder?
Oder wie kann ich testen ob jetzt ein Spiel-Server (in diesem Fall Call of Duty 4) mit der DyDNS arm1.ath.cx und Port 28960 online ist? |
Re: Überprüfen ob ein 'Server' online ist
Zitat:
|
Re: Überprüfen ob ein 'Server' online ist
jupp, das war bei meinem Anbiter damals.
der Server war erreichbar, aber PHP verreckte öfters mal. da hatte ich dann mal 'ne Zeit lang eine Datei (z.B. html) geladen und dann noch eine PHP-Datei ausführen lassen und bei beidem prüfte ich dann den Inhalt ... vorallem das Script lieferte mir von der URL(einem Parameter) abhängige Inhalte und so konnte ich prüfen ob deses auch lief. also der Server war immer ereichbar, aber PHP und manchmal auch http selbst versagte. (interne Serverprobleme) |
Re: Überprüfen ob ein 'Server' online ist
Was schlägt ihr mir dann vor wie ich kontrollieren kann ob der 'andere' PC online ist und auch reagiert?
Wenns hilf, genauere Info: Mit Server ist der Spiel-Server Call of Duty 4 gemeint. Weiß jemand wie ich dann überprüfen kann ob dieser online ist? IP + Port vom Server: arm1.ath.cx:28960 |
Re: Überprüfen ob ein 'Server' online ist
Es wurden dir doch schon genug Möglichkeiten genannt. Wo ist jtzt das Problem?
|
Re: Überprüfen ob ein 'Server' online ist
Hab jetzt eine Unit gefunden mit der ich eine IP anpingen kann. Doch wenn ich diese Unit compiliere spuckt mir der Compiler folgende Fehler Meldung aus: [DCC Fehler] Unit2.pas(79): E2010 Inkompatible Typen: 'Char' und 'AnsiChar'
Betroffen ist die Zeile 79 (phe := GetHostByName(PChar(AIP));) phe ist PHostEnt Und hier ist die ganze Unit die ich gefunden habe und gerne benutzen würde:
Delphi-Quellcode:
unit Unit2;
interface uses Windows, SysUtils, Classes; type TSunB = packed record s_b1, s_b2, s_b3, s_b4: byte; end; TSunW = packed record s_w1, s_w2: word; end; PIPAddr = ^TIPAddr; TIPAddr = record case integer of 0: (S_un_b: TSunB); 1: (S_un_w: TSunW); 2: (S_addr: longword); end; IPAddr = TIPAddr; function IcmpCreateFile : THandle; stdcall; external 'icmp.dll'; function IcmpCloseHandle (icmpHandle : THandle) : boolean; stdcall; external 'icmp.dll'; function IcmpSendEcho (IcmpHandle : THandle; DestinationAddress : IPAddr; RequestData : Pointer; RequestSize : Smallint; RequestOptions : pointer; ReplyBuffer : Pointer; ReplySize : DWORD; Timeout : DWORD) : DWORD; stdcall; external 'icmp.dll'; function Ping(InetAddress : string) : boolean; implementation uses WinSock; function Fetch(var AInput: string; const ADelim: string = ' '; const ADelete: Boolean = true) : string; var iPos: Integer; begin if ADelim = #0 then begin // AnsiPos does not work with #0 iPos := Pos(ADelim, AInput); end else begin iPos := Pos(ADelim, AInput); end; if iPos = 0 then begin Result := AInput; if ADelete then begin AInput := ''; end; end else begin result := Copy(AInput, 1, iPos - 1); if ADelete then begin Delete(AInput, 1, iPos + Length(ADelim) - 1); end; end; end; procedure TranslateStringToTInAddr(AIP: string; var AInAddr); var phe: PHostEnt; pac: PChar; GInitData: TWSAData; begin WSAStartup($101, GInitData); try phe := GetHostByName(PChar(AIP)); if Assigned(phe) then begin pac := 'phe^.h_addr_list^'; if Assigned(pac) then begin with TIPAddr(AInAddr).S_un_b do begin s_b1 := Byte(pac[0]); s_b2 := Byte(pac[1]); s_b3 := Byte(pac[2]); s_b4 := Byte(pac[3]); end; end else begin raise Exception.Create('Error getting IP from HostName'); end; end else begin raise Exception.Create('Error getting HostName'); end; except FillChar(AInAddr, SizeOf(AInAddr), #0); end; WSACleanup; end; function Ping(InetAddress : string) : boolean; var Handle : THandle; InAddr : IPAddr; DW : DWORD; rep : array[1..128] of byte; begin result := false; Handle := IcmpCreateFile; if Handle = INVALID_HANDLE_VALUE then Exit; TranslateStringToTInAddr(InetAddress, InAddr); DW := IcmpSendEcho(Handle, InAddr, nil, 0, nil, @rep, 128, 0); Result := (DW <> 0); IcmpCloseHandle(Handle); end; end. |
Re: Überprüfen ob ein 'Server' online ist
dann sachau doch mal nach was GetHostByName für einen Parameter haben möchte (ich vermute mal einen PAnsiChar und du übergibst PChar)
PS: du solltest deine Delphi-Version mal ins DP-Profil eintragen, oder diese in bei deinen Fragen mit erwähnen. (diese Angabe ist nicht nur zum Angeben, sondern damit man weiß auf welches System man seine Antworten beziehen muß) Aber ich bin mir sicher daß du D2009 (richtig getippt?) nutzt und da ist ... PChar = PWideChar |
Re: Überprüfen ob ein 'Server' online ist
ok problem gelöst, ich benutzte d2009, richgitg geraten :D, und habe auch überal pcahr mit pansichar ersetzt.
Nun wenn ich alles starte bekomme ich jedesmal den Fehler: Error getting HostName. Dieser wird nur dann aufgerufen wenn Assigned(phe) false ist. Keine Ahnung was Assigned(phe) heißt o.O Ich habe die DynDNS arm1.ath.cx eingeben -> ging nicht Auch mit der IP die sich hinter arm1.ath.cx befindet gehts auch sogar 127.0.0.1 nimmt er auch nicht an o.O |
Re: Überprüfen ob ein 'Server' online ist
Zitat:
Assigned(phe) entspricht phe <> nil |
Re: Überprüfen ob ein 'Server' online ist
wie soll ich den dazugehörigen string ändern?
Bei mir sieht das ganz so aus:
Delphi-Quellcode:
und weiter unten:
pac: PAnsiChar;
Delphi-Quellcode:
vorher sah das so aus:
phe := GetHostByName(PAnsiChar(AIP));
Delphi-Quellcode:
und
pac: PChar;
Delphi-Quellcode:
phe := GetHostByName(PChar(AIP));
|
Re: Überprüfen ob ein 'Server' online ist
PChar + AIP als String
PAnsiChar + AIP als AnsiString aber eigentlich sollte Delphi da auch meckern, wenn man PAnsiChar auf einen String/WideString/UnicodeString anwendet |
Re: Überprüfen ob ein 'Server' online ist
Klasse!!!!!!!!!!!!!!!!!!!!!!
Alles funktioniert suuuuper :D Größten DANK!!!!!!!!!!!!! :dp: :dp: :dp: :dp: :dp: :bounce2: :bounce2: :bounce2: |
Re: Überprüfen ob ein 'Server' online ist
Äh Moment mal.
Ping ist nur ein Programm von Microsoft, welches ICMP Requests abruft. Wenn der Host/Server aber nicht auf ICMP Requests antwortet, dann heißt das nochlange nicht, dass der Host nicht verfügbar ist. In jeder gescheiten Firewall kann man einstellen, ob ein ICMP Replys gesendet werden sollen. Und wie das hier einer schon bemerkte: Wenn ein Reply zurückkommt, heißt das noch lange nicht, dass der Dienst auf dem Host auch antwortet. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz