| Autor |
Beitrag |
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: So 14.08.05 20:17
Hallo Leute.
Ich möchte einen Servermanager für ein Spiel programmieren (wie z.B. HLSW, so ähnlich). Es geht um Lineage2. Das klappt alles schon ganz nett, ABER: Wie bekomme ich heraus, op der Server gerade online ist? Ich kenne Ports: 7777 ist der Gameserver, und 2107 ist der Loginserver. Um heraus zu finden, ob er online ist, habe ich den Code von Harry M. benutzt;
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| procedure TForm1.IdIcmpClient1Reply(ASender: TComponent; const AReplyStatus: TReplyStatus); var sTime: string; IP,BYTES, TTL, TIME : string; begin
IdIcmpClient1.ReceiveTimeout := 500; IdIcmpClient1.BufferSize := 1000;
if AReplyStatus.MsRoundTripTime = 0 then begin sTime := '<1' end else begin sTime := '='; end;
IP := Format('%s', [AReplyStatus.FromIpAddress]) ; BYTES := Format('%d', [AReplyStatus.BytesReceived]); TTL := Format('%d', [AReplyStatus.TimeToLive]); TIME := Format('%d', [AReplyStatus.MsRoundTripTime]);
if BYTES <> '0' then begin showmessage(TimeToStr(NOW)+' Antwort von '+IP+': Bytes='+BYTES+' Zeit='+TIME+'ms TTL='+TTL); Application.ProcessMessages; end;
if BYTES = '0' then begin showmessage(TimeToStr(NOW)+' Zeitüberschreitung der Anforderung für '+IdIcmpClient1.Host); Application.ProcessMessages; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin IdIcmpClient1.Host:=edit1.Text; IdIcmpClient1.port:=strtoint(edit2.Text); IdIcmpClient1.Ping(); end; |
Aber cih weis nicht genau, ob das klappt! es ist möglich, dass der rootserver online ist, während der Gameserver nicht on ist, und darum weis ich nicht ob der code hier reicht. Habt ihr eine Ahnung? Ich weis nicht, ob der Server automatisch den Port schließt, wenn die Serverapplication vom L2 server nicht an ist...
edit: gerade getestet. auch von einem offline server hab ich ne antwort bekommen 
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Prinz_Inside
      
Beiträge: 29
|
Verfasst: So 14.08.05 20:33
dann musste einfach die antwork, die du ja immer (on und off) bekommst, auswerten oder?
mfg
tim
|
|
JayEff 
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: So 14.08.05 21:31
Wie meinst du das? Welche Antwort soll ich auswerten? wieviele bytes ich zurückbekomme? oder was meinst du? Ich verstehe nicht so ganz... oO
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Prinz_Inside
      
Beiträge: 29
|
Verfasst: So 14.08.05 21:40
hi!
aaalso, wenn du einen request an den gameserver machst, musste doch auch ne antwort bekommen.
un anhand der antwort musste doch bestimmen können, ob der server jetzt on der off is, oder?
mfg
tim
|
|
JayEff 
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: So 14.08.05 21:45
HÄ??
Hast du dir meinen Code angeguckt? Ich glaube nicht! Ich hab keine ahnung was du mit Request oder Antwort meinst! Ich meine mit Antwort: "Ja! Ich bin da! Solange hat der Ping gedauert: blah"
Mehr nicht! Ist denn ein Request ein Ping? Ich weis es ja nicht! oO Ich glaube wir reden aneinander vorbei. Poste doch mal code, wie du es meinst!
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: So 14.08.05 23:03
Moin!
Dein bisheriger Code ist nichts anderes als ein PING auf Basis der Indies, damit kriegst du nur raus, ob der Recher, den du da anpingst, einen laufenden IP-Stack hat, aber nicht, ob die Dienste, die du prüfen willst, laufen. Du mußt also IMHO drei Dinge tun, um das, was du haben willst, herauszufinden:
1. Ping auf den Hostnamen/IP, um zu wissen, ob die Maschine überhaupt am Netz ist.
2. Einen Connect auf Port 2107 (vermutlich TCP), um zu sehen, ob der Loginserver reagiert (ggfs. die Antwort des Servers nach dem Connect noch auswerten).
3. Einen weiteren Connect auf Port 7777, um zu sehen, ob der Gameserverdienst läuft.
Allerdings: Ich rate davon ab, 2.+3. in regelmäßigen Abständen unterhalb von 30min zu tun; ich als Provider (= Betreiber des Servers) würde dann deine IP blocken...  du kostet dann nämlich deutlich Performance, wenn man das vielen Leuten gleichzeitig erlauben würde!
cu
Narses
|
|
Prinz_Inside
      
Beiträge: 29
|
Verfasst: Mo 15.08.05 11:16
aber dann könnte man ja zb hingehen und die schritte 2 und 3 alle x minuten von einem php-skript machen lassen, dass auf deinem eingenen server läuft.
das php-skript speichert den status des/der server/s in einer db oder einer einfachen textfile und die leute die dein proggramm verwenden, fragen nur bei deinem eigenen php-skript nach, ob der gameserver (etc) läuft oder nicht.
so würde es von der performance her nix machen, zumal diese anfrage, wenn sie vom php-skript gemacht wird, sowieso viiiell schneller von statten geht, weil dein server (hoffentlich  ) ne wesentlich bessere internetanbindung hat wie du.
das wär der optimale lösungsweg (also narses idee, ein bisschen gewürzt mit meiner idee  )
cu
tim
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 15.08.05 11:27
Moin!
Prinz_Inside hat folgendes geschrieben: | aber dann könnte man ja zb hingehen und die schritte 2 und 3 alle x minuten von einem php-skript machen lassen, dass auf deinem eingenen server läuft.
das php-skript speichert den status des/der server/s in einer db oder einer einfachen textfile und die leute die dein proggramm verwenden, fragen nur bei deinem eigenen php-skript nach, ob der gameserver (etc) läuft oder nicht.
das wär der optimale lösungsweg |
Diese Lösung ist definitiv schlechter als die bisher diskutierte, denn bei deiner Lösung wird noch ein weiteres, möglicherweise ausfallendes, Glied in die Abfragekette eingebaut: der "achsotollschnellangebundene" Webserver.
Prinz_Inside hat folgendes geschrieben: | so würde es von der performance her nix machen, zumal diese anfrage, wenn sie vom php-skript gemacht wird, sowieso viiiell schneller von statten geht, weil dein server (hoffentlich ) ne wesentlich bessere internetanbindung hat wie du. |
Selbst wenn dein mit PHP-Script bewaffneter Server direkt neben dem Gameserver stehen würde und von mir aus auch eine Gigabit-Anbindung hätte, würde es den Gameserver Performance kosten, auf die Anfragen zu reagieren, und das ist der Punkt, den ich als Serverbetreiber missbillige, egal ob die Anfrage von einem PHP-Script, einem Delphi-Programm oder einem Puppenspieler kommt...
Mein Fazit: Vergiss diese Lösung, wenn du nicht einer größeren Gruppe von Leuten diesen Dienst anbieten möchtest.
cu
Narses
|
|
JayEff 
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mo 15.08.05 15:14
Ok, ich weis nicht was ihr mit einem connect meint. Ich vermute ihr meint idTCPClient.connect aber wie genau? ich weis es nicht. Ich habe ein PHP skript bekommen, leider unvollständig, weil mein MSN-Email blöder weise HTML daraus gemacht hat... Es sah sehr komisch aus mit den ganzen " und so zeugs. Ich habe versucht zu retten, was zu retten war, aber die ersten Zeilen fehlten. Vielleicht kann einer von euch was damit anfangen:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| <?PHP "YOURIPHERE:2106", "Game Server" => "YOURIPHERE:7777",); while(list($ServerName,$Host)=each($IP)) { list($IPAddress,$Port)=explode(":",$Host); echo("<td><div>".$ServerName."</div></td><td>"); if($fp=fsockopen($IPAddress,$Port,$ERROR_NO,$ERROR_STR,(float)0.5)) { echo('<div style="font-weight:~bold~\ ~">UP</div>'); fclose($fp); } else { echo ('<div style="font-weight:~bold~\ ~">DOWN</div>'); } echo ("</td></tr><tr>"); } echo ("</table>"); ?> |
Zu finden ist dieses (vollständige) Skript auf: www.l2devils.com/serverstatus.php
Dieses Skript refresht etwa alle 30-60 sek und zeigt relativ sicher an, ob der server on ist oder nicht. Ausserdem kann ich garantieren, das sehr oft etwa 10-20 leute gleichzeitig dieses skript im Browser laufen haben, und Lags gibts trotzdem eher selten.
Danke erstmal für eure Bemühungen, ich hoffe, wir finden eine Lösung! 
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
JayEff 
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mi 17.08.05 17:55
hier hab ich für euch das komplette skript:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| <?PHP /*
rights of aegis and others */ error_reporting(0);
$IP = array( "Login Server" => "YOURIPHERE:2106", "Game Server" => "YOURIPHERE:7777", );
while(list($ServerName,$Host)=each($IP)) { list($IPAddress,$Port)=explode(":",$Host); echo("<TD><DIV>".$ServerName."</DIV></TD><TD>"); if($fp=fsockopen($IPAddress,$Port,$ERROR_NO,$ERROR_STR,(float)0.5)) { echo("<DIV style=\"color:'green';font-weight:'bold'\">UP</DIV>"); fclose($fp); } else { echo ("<DIV style=\"color:'blue';font-weight:'bold'\">DOWN</DIV>"); } echo ("</TD></TR><TR>"); } echo ("</TABLE>"); ?> |
Aber ich kenne mich nicht gut genug mit PHP aus um zu verstehen, wie das funktioniert! Woher kommen zum bleistift die Variablen $Host $ServerName $IPAdress $Port ?? Warum ist in der If Abfrage kein vergleich sondern eine Zuweisung?
edit: Ok alles klar: ich muss nu noch die delphi entsprechung von fsockopen finden. denn offensichtlich reicht es, wenn fsockopen klappt, um zu beweisen dass der server online ist. Sagt jedenfalls ein anderes zugesandtes Skript.
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 17.08.05 23:04
Moin!
JayEff hat folgendes geschrieben: | | ich muss nu noch die delphi entsprechung von fsockopen finden. |
Wenn du mit TClientSocket leben kannst, dann die entsprechenden Parameter einstellen (Host und Port) und dann ClientSocket1.Open; oder ClientSocket1.Active := TRUE; das ist gleichwertig. Wenn du dann kein .OnError oder eine Exception um die Ohren gehauen bekommst, hat der Connect geklappt.
cu
Narses
|
|
JayEff 
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Do 18.08.05 02:22
Ganz sicher? Er bringt keine exception, obwohl meine firewall den zugang gesperrt hatte oO also DAS ist ein beweis, dass das immer ohne exception funktioniert, selbst wenn ich nichtmal internet haette - oder??? oO
ich ueberlege mir tatsächlich ein phpscript im TWebBrowser auszufuehren... das muesste ich dann immer neu hochladen... also muss ich FTP zugangsdaten in der exe verstecken... oder ich übergebe die IP an das script - das scheint mir schlauer... ^^' ja so werd ichs wohl machen.
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 18.08.05 09:19
Moin!
Soeben mit diesem Code getestet, funktioniert wie beabsichtigt.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, StdCtrls;
type TForm1 = class(TForm) Hostname: TEdit; Port: TEdit; BtnConnect: TButton; ClientSocket: TClientSocket; procedure BtnConnectClick(Sender: TObject); procedure ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket); procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.BtnConnectClick(Sender: TObject); begin ClientSocket.Host := Hostname.Text; ClientSocket.Port := StrToIntDef(Port.Text,0); if (ClientSocket.Port <> 0) then ClientSocket.Open else ShowMessage('Ung³ltige Portnummer!'); end;
procedure TForm1.ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket); begin ClientSocket.Close; ShowMessage('Connect OK!'); end;
procedure TForm1.ClientSocketError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin ClientSocket.Close; ErrorCode := 0; ShowMessage('Connect Fehler!'); end;
end. |
Möglicherweise hast du deine Firewall nicht im Griff?
JayEff hat folgendes geschrieben: | | also DAS ist ein beweis, dass das immer ohne exception funktioniert, selbst wenn ich nichtmal internet haette |
Wenn du einen Connect auf einem nicht existenten ServerSocket versuchst, kriegst du garantiert einen AsynchronousSocketError! Wenn nicht, hast du einen Fehler im Code.
JayEff hat folgendes geschrieben: | | das scheint mir schlauer... ^^' ja so werd ichs wohl machen. |
Davon rate ich ab, wenn das ganze nicht direkt auf dem Webserver dazu da sein soll, eine lokal auf dem Webserver liegende Datenbank zu füllen; sonst ist das dämlich...
cu
Narses
|
|
JayEff 
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Do 18.08.05 23:31
Nun, ich hab nur Open; gemacht und mich gewundert warum es geht. haettest mir mal sagen muessen, dass ich da noch 2 weitere procedures brauch oO
edit: Ok alles Klar, Das Programm ist soweit dann fertig - Wenn ihr es mal testen wollt und Lineage2 habt, dann könnt ihr das Programm einfach nur zu entpacken und zu starten - Es ist schon ein Server in der Configdatei drin, wenn ihr auf Connect klickt wird eure HOSTS datei ÜBERSCHRIEBEN, also solltet ihr lieber ein Backup davon machen, oder gleich die dortige IP in den ServerManager speichern. Hier der DW Link:
www.jayy.de/L2SA.zip
Und wenn ihr Lineage2 noch nicht habt und euch unbedingt 1,8 GB runterladen wollt: l2clientdownload.lin.../L2_C3_Installer.zip
Da habt ihr.
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
|