|
Descentforum.DE
|
View previous topic :: View next topic |
Author |
Message |
karx11erx Diedel
Joined: 09 Feb 2004 Posts: 888
Location: Karlsruhe, Germany
|
Posted: 15.04.2005, 09:58 Post subject: |
|
|
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 |
|
|
Munk Forum-Nutzer
Joined: 30 Jun 2001 Posts: 2140
Location: Herzogenrath
|
Posted: 15.04.2005, 10:56 Post subject: |
|
|
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 |
|
|
karx11erx Diedel
Joined: 09 Feb 2004 Posts: 888
Location: Karlsruhe, Germany
|
Posted: 15.04.2005, 11:42 Post subject: |
|
|
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 |
|
|
Munk Forum-Nutzer
Joined: 30 Jun 2001 Posts: 2140
Location: Herzogenrath
|
Posted: 15.04.2005, 15:05 Post subject: |
|
|
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 |
|
|
Munk Forum-Nutzer
Joined: 30 Jun 2001 Posts: 2140
Location: Herzogenrath
|
Posted: 15.04.2005, 20:43 Post subject: |
|
|
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 |
|
|
karx11erx Diedel
Joined: 09 Feb 2004 Posts: 888
Location: Karlsruhe, Germany
|
Posted: 15.04.2005, 23:15 Post subject: Danke Munk! :D |
|
|
Munk,
vielen herzlichen Dank für Deine Mühe und die Bereitstellung eines Trackers!
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.
karx
|
|
Back to top |
|
|
Munk Forum-Nutzer
Joined: 30 Jun 2001 Posts: 2140
Location: Herzogenrath
|
Posted: 16.04.2005, 07:52 Post subject: Re: Danke Munk! :D |
|
|
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:
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 |
|
|
karx11erx Diedel
Joined: 09 Feb 2004 Posts: 888
Location: Karlsruhe, Germany
|
Posted: 16.04.2005, 19:37 Post subject: |
|
|
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?
Deinen Autoren- und Copyleft-Vermerk füge ich natürlich gerne noch ein. Schon passiert.
karx
Last edited by karx11erx on 16.04.2005, 19:39; edited 1 time in total |
|
Back to top |
|
|
Munk Forum-Nutzer
Joined: 30 Jun 2001 Posts: 2140
Location: Herzogenrath
|
Posted: 16.04.2005, 19:58 Post subject: |
|
|
Ok hast recht.
|
|
Back to top |
|
|
exi Best Boy
Joined: 02 Jul 2002 Posts: 2173
Location: Hamburg-Osdorf
|
Posted: 20.04.2005, 15:02 Post subject: |
|
|
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 |
|
|
karx11erx Diedel
Joined: 09 Feb 2004 Posts: 888
Location: Karlsruhe, Germany
|
Posted: 20.04.2005, 15:18 Post subject: |
|
|
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. 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 |
|
|
Munk Forum-Nutzer
Joined: 30 Jun 2001 Posts: 2140
Location: Herzogenrath
|
Posted: 20.04.2005, 16:11 Post subject: |
|
|
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 |
|
|
karx11erx Diedel
Joined: 09 Feb 2004 Posts: 888
Location: Karlsruhe, Germany
|
Posted: 20.04.2005, 16:15 Post subject: |
|
|
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 |
|
|
exi Best Boy
Joined: 02 Jul 2002 Posts: 2173
Location: Hamburg-Osdorf
|
Posted: 20.04.2005, 18:18 Post subject: |
|
|
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.
|
|
Back to top |
|
|
VEX-Eagle Falschparker
Joined: 04 Feb 2003 Posts: 807
Location: Stelle (Hamburg)
|
Posted: 20.04.2005, 20:14 Post subject: |
|
|
aber wenn er es machen sollte, dann mit einem seil zum zurückholen
|
|
Back to top |
|
|
karx11erx Diedel
Joined: 09 Feb 2004 Posts: 888
Location: Karlsruhe, Germany
|
Posted: 20.04.2005, 21:18 Post subject: |
|
|
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 |
|
|
|
|
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
|
|