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):
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