Descentforum.DE Forum Index Descentforum.DE
Search | FAQ | Memberlist | Usergroups | Newsfeed Newsfeed  Register
Profile | Log in to check your private messages | Log in 
Chat | D3-Tactics | Downloads | Map | Links | Serverlist | Teamspeak 

Descent 2 Tracker (-software)
Goto page Previous  1, 2
 
Post new topic   Reply to topic    Descentforum.DE Forum Index -> Alternativen - Clones - Visionen
View previous topic :: View next topic  
Author Message
karx11erx
Diedel


Joined: 09 Feb 2004
Posts: 888
Location: Karlsruhe, Germany

PostPosted: 15.04.2005, 09:58    Post subject: Reply with quote

Hallo Munk,

Gestern abend bist Du leider früh verschwunden.

D2X läuft bei Dir nicht? Hast Du keinen Windows-Rechner, oder was passiert?

Ich bekomme als Antwort wie gesagt die Fehlermeldung '10054' (Connection reset by peer), wenn ich dem Tracker eine Anfrage schicke. Das kann vieles bedeuten: Daß die Anfrage zurückgewiesen wird (Firewall?), daß der Empfänger abgestürzt ist, vielleicht auch, daß das Anfrageprotokoll nicht mit dem vom Empfänger für den Port spezifizierten Protokoll übereinstimmt.

Hast Du Deinen Socket denn als UDP-Socket geöffnet? Leider kann ich nicht sagen, wie der entspr. Aufruf in Perl aussieht, aber es werden andere Parameter gesetzt als für TCP/IP. Mit WinSock 2 sieht das ungefähr so aus:

int mySocket = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);

Wichtig ist a) SOCK_DGRAM (d.h. es werden Datagramme verschickt und kein Ack/Antwort erwartet - WinSock 2 verwendet dafür dann UDP), und b) der Protokoll-Parameter (unter WinSock 2 IPPROTO_UDP).

karx


Last edited by karx11erx on 15.04.2005, 10:13; edited 2 times in total
Back to top
View user's profile Send private message
Munk
Forum-Nutzer


Joined: 30 Jun 2001
Posts: 2140
Location: Herzogenrath

PostPosted: 15.04.2005, 10:56    Post subject: Reply with quote

Code:

#!/usr/bin/perl
# Server Program
use IO::Socket::INET;
use Data::Dumper;

# Config
my $TIMEOUT;
my $LISTENPORT;

$TIMEOUT = 30;
$LISTENPORT = 9424;

# Create a new socket
$InSocket = new IO::Socket::INET->new(LocalPort=>$LISTENPORT,Proto=>'udp');
print ">> Server Program <<\n";
%Tracker=();

# Keep receiving messages from client
while(1) {
        $InSocket->recv($Message,7);
        print "Incoming Message: ", $Message , "\n";
        if ($Message =~ /^S/) {                                 # incoming Message from Server: store Message in List
                print "Message from Server\n";
                if (length($Message) == 7) { # valid Message ?
                        print "Valid Message\n";
                        $key = substr($Message, 1, 6); # Key is IP-Address and Port (6 Bytes)
                        $Tracker{$key} = time();
                        print Dumper(\%Tracker);
                }
        } elsif ($Message =~ /^R$/) {   # incoming Message from Client: read List
                print "Message from Client\n";

                # Updating Tracker list, delete old Tracker Entries
                while ($key = each(%Tracker)) {
                        print "Differences ", $key, ": ", time() - $Tracker{$key}, "\n";
                        if (time() - $Tracker{$key} > $TIMEOUT) { #Timeout ?
                                delete $Tracker{$key};
                        }
                }

                # Creating Response
                $Count = keys(%Tracker);
                print "Count: ", $Count, "\n";
                $Response = "S" . chr($Count);
                while ($key = each(%Tracker)) {
                        $Response .= $key;
                }
                $Response .= "\x00" x (512 - length($Response));

                print "Length Response: ", length($Response), "\n";

                $Host = $InSocket->peerhost();
                $Port = $InSocket->peerport();

                $OutSocket = new IO::Socket::INET->new(PeerPort=>$Port,Proto=>'udp',PeerAddr=>$Host);
                $OutSocket->send($Response);
                print "Host: ", $Host, ":", $Port, " -> #", $Response, "#\n";

        }
}


Ist noch jede Menge Debug-Zeug drin, sollte ja aber auch nicht stören.

Wo ich nicht ganz sicher bin, ist ob bei der Antwort ein neuer Socket erzeugt werden muß (da UDP verbindunslos ist), oder ob ich den eingehenden Socket weiterverwenden kann.
Vermutlich liegt in letzterem der Fehler.


Die Frage, ob NAT Probleme macht, wenn IP+Port im Tracker-Protokoll drinsteht, würde ich selbst verneinen.
IP+Port von dem eingehenden Header zu lesen, halte ich für falsch. Die Zuordnung zwischen diesem Port des Routers und dem Port des Servers erfolgt ja nur innerhalb dieser Verbindung. Von außen neu eingehende Verbindungen übersetzt NAT ja nicht.
Deshalb ist es falsch, die von NAT übersetzten Daten für den Tracker zu verwenden.

Vielmehr muß der Server seinem Router per Port-Forwarding darauf aufmerksam machen, daß Verbindungen an den Serverport durchgereicht werden.


Last edited by Munk on 15.04.2005, 11:04; edited 2 times in total
Back to top
View user's profile Send private message Send e-mail
karx11erx
Diedel


Joined: 09 Feb 2004
Posts: 888
Location: Karlsruhe, Germany

PostPosted: 15.04.2005, 11:42    Post subject: Reply with quote

Munk,

danke für das Listing.

1. sollten die Anfragen als 1-Byte-Pakete behandelt werden. Ich weiß nun nicht was passiert, wenn Du 7 Bytes spezifizierst, ich aber 1 Byte angebe. Mein Client-Code schickt z.B. immer nur ein 'R' - 1 Byte.

2. Gibt es konkret ständig aufgetretene Fälle, wo D2X die eigene IP-Adresse nicht ermitteln kann. Es ist aber kein Problem, dann die Absender-Adresse von D2X-W32 zu verwenden (so mache ich es auch, um dem Game Host letztendlich doch zu sagen, welche Adresse er hat: Die Clients packen die Adresse, von der sie die Serverdaten erhalten, einfach in die Client-Daten mit rein, und der Server extrahiert sie von dort um rauszukriegen, welche IP der Rechner/das Netzwerk, auf dem er läuft ihm eigentlich gegeben haben).

Sorry, geht nicht anders. Ich habe keine Möglichkeit, die D2X-Server-Adresse zuverlässig vom Programm aus zu ermitteln, und der Vorschlag, einfach die Absender-IP & Port des Servers zu verwenden, ist erprobt. Da der Server den Port während seiner ganzen Laufzeit verwendet bzw. bei Port-Wechsel einen neuen Eintrag an den Tracker schickt, sollte das eigentlich immer funktionieren.

Du kannst bei UDP denselben Socket verwenden oder jedesmal einen neuen aufmachen - ist egal. UDP ist so eine Art non-blocking TCP - der Empfänger muß ständig an seinem Port lauschen, ob was ankommt, es gibt keinerlei Kommunikation über den Erfolg von Versand/Empfang.

[color=lime]Update:

Ich habe meinen Code so umgestellt, daß alle Anfragen 7 Bytes lang sind und eine gültige IP-Adresse enthalten. Ich bekomme trotzdem immer eine Fehlermeldung zurück; interessanterweise auch, wenn ich ein Server-Paket ('S'<IP,Port>) schicke, wo ich gar keine Antwort will. Für mich sieht es so aus, als ob auf Deiner Seite was schiefgeht.

karx

PS: Wenn ich Skype nach 'VEX-Munk' suchen lasse, bekomme ich die Meldung dass das ein ungültiger Skype-Name sei.


Last edited by karx11erx on 15.04.2005, 12:10; edited 5 times in total
Back to top
View user's profile Send private message
Munk
Forum-Nutzer


Joined: 30 Jun 2001
Posts: 2140
Location: Herzogenrath

PostPosted: 15.04.2005, 15:05    Post subject: Reply with quote

karx11erx wrote:
Munk,
1. sollten die Anfragen als 1-Byte-Pakete behandelt werden. Ich weiß nun nicht was passiert, wenn Du 7 Bytes spezifizierst, ich aber 1 Byte angebe. Mein Client-Code schickt z.B. immer nur ein 'R' - 1 Byte.


Der Parameter in der Recv-Methode ist die _maximale_ Anzahl von Bytes, die zurückgegeben wird. Damit kann man dem Teil seine Pufferlänge mitgeben, damit es nicht zum Überlauf kommt.
Hier werden halt Pakete mit maximal 7 Bytes zurückgegeben. Was ja nicht verkehrt ist.
D.h. auch bei Requestes, die nur 1 Byte lang sind, erhalte ich auch nur dieses 1 Byte zurück.
Dein Update ist also unnötig.

Mit einem rudimentären Client habe ich das Beschreiben des Trackers auch erproben können.
Was ich allerdings nicht weiß ist, ob die Zeilen
Code:

 $OutSocket = new IO::Socket::INET->new(PeerPort=>$Port,Proto=>'udp',PeerAddr=>$Host);
 $OutSocket->send($Response);

auch tatsächlich das Paket herausschicken.
$Port und $Host sind jedenfalls richtig gesetzt, $Response enthält die korrekten Antwortdaten.




Quote:

Ich habe keine Möglichkeit, die D2X-Server-Adresse zuverlässig vom Programm aus zu ermitteln, und der Vorschlag, einfach die Absender-IP & Port des Servers zu verwenden, ist erprobt.

Ist ok, das kann ich ändern.
Nur ersteinmal schaun, wie ich das anstelle. Die Datenmanipulation auf Byteebene in Perl ist nicht gerade sehr ausgereift.

@Skype: das hab ich eh nicht laufen. ICQ ist 21218485. Eignet sich zur "technischen Kommunikation" eh besser.

@Zur Fehlersuche des Verbindungsresets:
Mir wäre es lieb, wenn ich dabei sein könnte, wenn Du deine Testreihen machst.
Dann kann ich dir auch sagen, ob deine Daten richtig ankommen.
Alles andere ist bloße Spekulation.
Back to top
View user's profile Send private message Send e-mail
Munk
Forum-Nutzer


Joined: 30 Jun 2001
Posts: 2140
Location: Herzogenrath

PostPosted: 15.04.2005, 20:43    Post subject: Reply with quote

Allein der Vollständigheit halber nun der Code für den Tracker, falls jemand auf die irrwitzige Idee kommt, auch einen bereitstellen zu wollen (was natürlich blöd ist, denn Server und Client müssen sich schon auf einen Tracker einigen.)

Code:

#!/usr/bin/perl
# Server Program
use IO::Socket::INET;
use Data::Dumper;

# Config
my $TIMEOUT;
my $LISTENPORT;

$TIMEOUT = 30;
$LISTENPORT = 9424;

# Create a new socket
$InSocket = new IO::Socket::INET->new(LocalPort=>$LISTENPORT,Proto=>'udp');
print ">> Server Program <<\n";
%Tracker=();

# Keep receiving messages from client
while(1) {
   $InSocket->recv($Message,8);
   print "Incoming Message: ", $Message , "\n";
   if ($Message =~ /^S/) {               # incoming Message from Server: store Message in List
      print "Message from Server\n";
      $key = $InSocket->peeraddr() . chr(int($InSocket->peerport() / 256)) . chr($InSocket->peerport() % 256);
      $Tracker{$key} = time();
      print Dumper(\%Tracker);
   } elsif ($Message =~ /^R/) {   # incoming Message from Client: read Message from List
      print "Message from Client\n";

      # Updating Tracker list, delete old Tracker Entries
      while ($key = each(%Tracker)) {
         print "Differences ", $key, ": ", time() - $Tracker{$key}, "\n";
         if (time() - $Tracker{$key} > $TIMEOUT) { #Timeout ?
            delete $Tracker{$key};
         }
      }

      # Creating Response
      $Count = keys(%Tracker);
      print "Count: ", $Count, "\n";
      $Response = "S" . chr($Count);
      while ($key = each(%Tracker)) {
         $Response .= $key;
      }      
      $Response .= "\x00" x (512 - length($Response));
      
      print "Length Response: ", length($Response), "\n";
      $InSocket->send($Response);      
   }
}

Back to top
View user's profile Send private message Send e-mail
karx11erx
Diedel


Joined: 09 Feb 2004
Posts: 888
Location: Karlsruhe, Germany

PostPosted: 15.04.2005, 23:15    Post subject: Danke Munk! :D Reply with quote

Munk,

vielen herzlichen Dank für Deine Mühe und die Bereitstellung eines Trackers! Sehr glücklich Sehr glücklich Sehr glücklich

Super super super!

Es funktioniert auf meiner Seite jetzt ebenfalls alles. Da Du ihn zur Verfügung stellst, werde ich den Code in meine D2X-W32-Distribution aufnehmen, damit jeder, der einen D2X-Tracker aufsetzen möchte, das problemlos tun kann.

Langsam gefällt mir D2X-W32 richtig gut. Mr. Green

karx
Back to top
View user's profile Send private message
Munk
Forum-Nutzer


Joined: 30 Jun 2001
Posts: 2140
Location: Herzogenrath

PostPosted: 16.04.2005, 07:52    Post subject: Re: Danke Munk! :D Reply with quote

karx11erx wrote:
Da Du ihn zur Verfügung stellst, werde ich den Code in meine D2X-W32-Distribution aufnehmen, damit jeder, der einen D2X-Tracker aufsetzen möchte, das problemlos tun kann.


Huch ? Ein wenig voreilig, wie ich finde.
Nur weil jemand hier Code hineinschreibt, heißt das nicht automatisch, daß jeder damit machen kann was er will. Damit Du also den Code in dein D2X (GPL) packen kannst, muß ich ihn dir erst geeignet lizensieren.

Füge ab der zweite Zeile noch ein:

Code:

# Author: Sebastian "VEX-Munk" Starosielec © 2005
# Contact: sebastian.starosielec@ruhr-uni-bochum.de
# License: GNU Public License



Dann kannst Du es mit D2X verbreiten.


Edit: Nicht zu harsch nehmen, aber ich möchte halt gerne, daß mein Name wenigstens drinsteht. Und ohne Lizenz-Verweis hättest Du es auch nicht mitliefern können.


Last edited by Munk on 16.04.2005, 07:59; edited 1 time in total
Back to top
View user's profile Send private message Send e-mail
karx11erx
Diedel


Joined: 09 Feb 2004
Posts: 888
Location: Karlsruhe, Germany

PostPosted: 16.04.2005, 19:37    Post subject: Reply with quote

Munk wrote:
Allein der Vollständigheit halber nun der Code für den Tracker, falls jemand auf die irrwitzige Idee kommt, auch einen bereitstellen zu wollen (was natürlich blöd ist, denn Server und Client müssen sich schon auf einen Tracker einigen.)
Lieber Munk,

wenn Du so was (-> Zitat) inkl. Quellcode-Listing hier rein schreibst, hast Du ihn de Fakto schon zur allgemeinen Verfügung freigegeben, oder nicht? Winken

Deinen Autoren- und Copyleft-Vermerk füge ich natürlich gerne noch ein. Schon passiert. Smilie

karx


Last edited by karx11erx on 16.04.2005, 19:39; edited 1 time in total
Back to top
View user's profile Send private message
Munk
Forum-Nutzer


Joined: 30 Jun 2001
Posts: 2140
Location: Herzogenrath

PostPosted: 16.04.2005, 19:58    Post subject: Reply with quote

Ok hast recht.
Back to top
View user's profile Send private message Send e-mail
exi
Best Boy


Joined: 02 Jul 2002
Posts: 2173
Location: Hamburg-Osdorf

PostPosted: 20.04.2005, 15:02    Post subject: Reply with quote

Kurze Zwischenfrage: Wird es eine Pendant zum descent.cx/tracker für D2X geben, also ein Tracker-Site? Ich frage, da eben eine neue Version von D2X für MacOSX releast wurde und binnen 1 Std. 520 mal geladen wurde.
Back to top
View user's profile Send private message
karx11erx
Diedel


Joined: 09 Feb 2004
Posts: 888
Location: Karlsruhe, Germany

PostPosted: 20.04.2005, 15:18    Post subject: Reply with quote

exi,

mein D2X hat mit dem "offiziellen" D2X nichts zu tun. Ich hatte solche Schwierigkeiten, da mit rein zu kommen, daß ich irgendwann meinen eigenen Entwicklungszweig angelegt habe (deshalb nenne ich es auch D2X-W32). Ergo ist in D2X auch keine Tracker-Software drin.

Was in Zukunft kommen wird ist, daß Steffen Pohle und/oder ich D2X-W32 auf Linux portieren werden (-> D2LinuX). Dann haben wenigstens die MS-Windows und die Linux-Gemeinde hier wieder eine gemeinsame Basis.

Wenn sich jemand findet, der D2X-W32 auf den Mac portieren will, helfe ich liebend gerne aus. Die meisten Änderungen sind nicht OS-spezifisch, und die paar, die es sind, sind in den Griff zu kriegen.

Wenn Du mal liest, was ich in D2X-W32 alles gemacht habe, wird Dir auch klar, daß das im Grunde der richtige Weg ist. In meinen Augen kannst Du D2X im Vergleich zu D2X-W32 inzwischen vergessen. Winken Bei der neuen Mac-Version funktioniert übrigens nicht mal der LAN-Code. Schade eigentlich.


Last edited by karx11erx on 20.04.2005, 15:28; edited 1 time in total
Back to top
View user's profile Send private message
Munk
Forum-Nutzer


Joined: 30 Jun 2001
Posts: 2140
Location: Herzogenrath

PostPosted: 20.04.2005, 16:11    Post subject: Reply with quote

Jo exi, sowas nennt man einen "fork". Sprich: die Entwicklungen gehen unabhängig in verschiedene Richtungen weiter. Gründe dafür gibts viele: Meistens gefällt einigen Leuten irgendetwas prinzipiell nicht, so daß sie eine eigene Richtung starten.
Hier bei D2X scheint es wohl so zu sein, daß der ursprüngliche Maintainer einfach kein Bock hat, mit jemand anders zusammenzuarbeiten oder generell D2X abgehagt hat (alles nur Spekulation).

Kurzfristig ist das natürlich schade, denn so gehen einige Ressourcen verschütt, die gebündelt besser eingesetzt werden könnte.
Langfristig finde ich es aber gesund, denn es setzt sich nachher derjenige Zweig durch, der besser ist. Es sorgt also für einen neunen frischen Wind, und mitgeschleppte Krankheiten können ausheilen.

Sehe es als Evolition an: irgendein Affe ist halt mal auf die Idee gekommen, anders als alle anderen vom Baum herunterzuklettern, und konnte dann letztendlich mit den dort gefundenen Steinen allerhand Werkzeug herstellen.....
Back to top
View user's profile Send private message Send e-mail
karx11erx
Diedel


Joined: 09 Feb 2004
Posts: 888
Location: Karlsruhe, Germany

PostPosted: 20.04.2005, 16:15    Post subject: Reply with quote

Munk wrote:
Sieh es als Evolution an: irgendein Affe ist halt mal auf die Idee gekommen, anders als alle anderen vom Baum herunterzuklettern, und konnte dann letztendlich mit den dort gefundenen Steinen allerhand Werkzeug herstellen.....
LOL! Huahuah!

Ja, Bradley Bell von icculus.org wollte mir keinen Schreibzugriff auf sein Versionskontrollsystem geben, bis ich mich "bewiesen" hätte. Ich hätte Diff-Listen meiner Änderungen anfertigen und ihm schicken sollen. Und das, wo ich 10mal soviel geändert habe wie der Rest zusammen. Das war mir doch zu blöd. Nachdem ich das dritte mal die Quellen aus CVS rausgeholt und meine Änderungen wieder reingebaut hatte, hatte es mir dann doch gereicht.

spitzelippenmachastreinsteckdranlutschastwegwerfunterdemarmkratzundmichaufdennächstenbaumtroll.


Last edited by karx11erx on 20.04.2005, 16:17; edited 2 times in total
Back to top
View user's profile Send private message
exi
Best Boy


Joined: 02 Jul 2002
Posts: 2173
Location: Hamburg-Osdorf

PostPosted: 20.04.2005, 18:18    Post subject: Reply with quote

Munk wrote:
Sehe es als Evolition an: irgendein Affe ist halt mal auf die Idee gekommen, anders als alle anderen vom Baum herunterzuklettern, und konnte dann letztendlich mit den dort gefundenen Steinen allerhand Werkzeug herstellen.....

Schade nur, dass der Affe auf dem Kontinent "Windows" seine Steinaxt nicht gegen einen der 500 Affen auf dem Kontinent "Apple" oder einen der unzähligen auf dem Kontinent "Pinguin" schwingen kann, um zu testen, ob sie auch wirklich Schädel spalten kann. blaues auge
Back to top
View user's profile Send private message
VEX-Eagle
Falschparker


Joined: 04 Feb 2003
Posts: 807
Location: Stelle (Hamburg)

PostPosted: 20.04.2005, 20:14    Post subject: Reply with quote

aber wenn er es machen sollte, dann mit einem seil zum zurückholen
Back to top
View user's profile Send private message
karx11erx
Diedel


Joined: 09 Feb 2004
Posts: 888
Location: Karlsruhe, Germany

PostPosted: 20.04.2005, 21:18    Post subject: Reply with quote

Die Invasionspläne für den Planeten der Pinguine sind in voller Vorbereitung. Mac habe ich leider nicht zur Verfügung. Aber bei 500 Leuten sollte doch einer proggen können?
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Descentforum.DE Forum Index -> Alternativen - Clones - Visionen All times are GMT + 2 Hours
Goto page Previous  1, 2
Page 2 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You can attach files in this forum
You can download files in this forum
PayPal


Descent is a trademark of Interplay Productions.
Descent, Descent II are © Parallax Software Corporation.
Descent III is © Outrage Entertainment.
Descentforum.DE and Descentforum.NET is © by Martin "Do_Checkor" Timmermann.
Powered by phpBB © 2001-2008 phpBB Group