Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]12735[/thread]

Serverprobleme nur bei erster Datenübertragung

Leser: 1


<< >> 6 Einträge, 1 Seite
Gast Gast
 2008-11-08 16:47
#116103 #116103
Hallo!

Ich habe einen GPS-Tracker, der per GPSR den Standort an einen Server senden kann. Dazu übermittelt er alle paar Minuten simples ASCII in der Form: $1234567890! Der Server gibt daraufhin $OK! zurück.

Den Code von faq.perl-community.de/bin/view/Wissensbasis/SimpleNonBlockingServer habe ich leicht angepasst und es funktioniert (fast):

Code (perl): (dl )
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
use strict;
use warnings;

use IO::Socket::INET;
use IO::Select;

my $Port = 2005;

my $server = IO::Socket::INET->new(
  LocalPort => $Port,
  type => SOCK_STREAM,
  Reuse => 1,
  Listen => 10
) or die "Server läuft nicht: $@\n";

my $select = IO::Select->new($server);

while (my @readable = $select->can_read) {
  for my $socket (@readable) {
    if ($socket == $server) {
      print "New client connects\n";
      my $client = $socket->accept;
      $select->add($client);
    }
    else {
      my $byte = $socket->getc;
      if (defined $byte) {

        print "$byte\n";

        if ($byte eq "!") { $socket->print("\$OK!"); }
      }
      else {
        print "Connection closed by client\n";
        delete_socket($select, $socket);
      }
    }
  }
}

sub delete_socket {...}

Das Problem: Nach dem Verbinden des GPS-Clients wird die erste Datenübermittlung nicht mit $OK! bestätigt. Ab der zweiten klappt es einwandfrei.

Mit Zeile 29 gebe ich testweise die einzelnen übermittelten Zeichen aus, dort stoppt die Ausgabe bei der 1. Übermittlung gleich nach dem $. Erst nach der 2. Übermittlung werden die restlichen Zeichen der 1. Übermittlung nachgeholt und zusammen mit der 2. ausgegeben (nur ein $OK! wird zurück gesendet). Danach läuft alles normal.

Ein Portscanner zeigt, dass die Übertragung vom GPS-Client einwandfrei und unverzögert funktioniert.

Beim Test mit dem XP-telnet klappt es auch problemlos.

Ich bin ja schon zufrieden, dass der Server ansonsten fehlerfrei läuft, aber dennoch würde mich interessieren, wo der Fehler liegt.

Danke für die Hilfe,
Bernd
murphy
 2008-11-08 19:28
#116105 #116105
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Ich vermute, Du musst die Ausgabe, die Du an das GPS-Gerät schickst, einfach noch flushen, also zum Beispiel in Zeile 31 print durch printflush ersetzen, oder direkt nach dem Akzeptieren der Verbindung zwischen Zeile 22 und 23 $client->autoflush(1); setzen.
When C++ is your hammer, every problem looks like your thumb.
Gast Gast
 2008-11-08 20:48
#116107 #116107
Beide Tipps haben leider nicht die gewünschte Wirkung gehabt, allerdings habe ich jetzt bei nochmaligen Tests festgestellt, dass ich durchgehend einen Zyklus zu spät bin, also:

1. Übertragung: Zeile 29 zeigt nur $ an (das erste übermittelte Zeichen)
2. Übertragung: Zeile 29 zeigt den Rest der ersten Übertragung sowie das $ der zweiten Übertragung an.
3. Übertragung: Zeile 29 zeigt den Rest der zweiten Übertragung sowie das $ der dritten Übertragung an.
usw.

Mir geht es jetzt auch nicht so um die Rückgabe des $OK!, das könnte ich sogar weglassen, da es dem GPS egal ist, ob da was zurück kommt. Allerdings erstelle ich mit den übermittelten Daten eine KML-Datei, die live abgerufen werden kann. Die ist dann im jetzigen Zustand immer einen Sendezyklus hinten dran.

Wenn ich das Ganze jetzt mit der telnet.exe von Windows XP teste (der Server befindet sich auf einem Linux-System, welches über ein WLAN erreicht wird), dann habe ich folgendes:

Manuelle Eingabe mit der Tastatur: Funktioniert einwandfrei.
Eingabe von $1234567890! mit Rechtsklick/Einfügen: Das gleiche Problem wie oben, nur dass statt dem einzelnen $ jetzt die ersten zwei Zeichen $1 angezeigt werden. Wenn ich dann irgendwann mal ein einzelnes Zeichen per Tastatur eingebe, dann werden die restlichen Ziffern "aufgeholt" und inklusive dem Tastaturzeichen angezeigt.

Wenn ich jetzt aber zum Testen den Server auf dem gleichen XP-System wie telnet laufen lasse, dann funktioniert alles einwandfrei - auch beim Einfügen mit Rechtsklick!

Bernd
murphy
 2008-11-09 13:21
#116122 #116122
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Hmm, wenn das so ist, dann flusht vielleicht der Client, also das GPS-Gerät bzw. die Telnet-Anwendung von Windows nicht oft genug, oder der Netzwerkstack auf mindestens einer Seite der Verbindung ist Müll ;-)

<haarspalterei>
Übrigens schreibst Du in Deinem ersten Posting
Quote
[...] Ein Portscanner zeigt, dass die Übertragung vom GPS-Client einwandfrei und unverzögert funktioniert. [...]

Das ergibt für mich aber keinen Sinn. Unter einem Portscanner verstehe ich eine Software, mit der man überprüfen kann, auf welchen TCP- und/oder UDP-Ports ein Server antwortet oder nicht. Um den Netzwerkverkehr zu überwachen und nachzuvollziehen, welche Daten über eine TCP-Verbindung übertragen werden, braucht man ein anderes Werkzeug, das meistens Paketlogger oder Sniffer genannt wird.

Die Wikipedia (Wikipedia: Portscanner, Wikipedia: Sniffer) bestätigt die Begriffsdefinitionen, die in meinem Kopf gespeichert waren ;-)
</haarspalterei>
When C++ is your hammer, every problem looks like your thumb.
Gast Gast
 2008-11-09 18:30
#116138 #116138
Das Problem war Zeile 26. Es klappt mit:

$socket->recv(my $byte,1);
oder
$socket->sysread(my $byte,1);

$socket->read(my $byte,1); klappt nicht, da gibt es die gleichen Probleme wie oben.

Und natürlich war es kein Portscanner, den ich benutzt habe, sondern ein Portsniffer :-)

Bernd
murphy
 2008-11-09 20:07
#116139 #116139
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Interessant! Ich dachte, dass getc bzw. read, wenn man nur ein einzelnes Byte anfordert, auch nicht puffert, schon gar nicht, wenn zuvor mit select geprüft wurde, ob Daten lesbar sind.

Irgendwie ist dieses Verhalten wenig intuitiv :-(
When C++ is your hammer, every problem looks like your thumb.
<< >> 6 Einträge, 1 Seite



View all threads created 2008-11-08 16:47.