Thread IO::Socket IO::Select Bei Receive klappt Timeout nicht (1 answers)
Opened by roco at 2012-10-24 10:55

roco
 2012-10-24 10:55
#162775 #162775
User since
2012-10-24
1 Artikel
Neuzugang
[default_avatar]
Hallo, ich habe einen Client geschrieben, der nach einer Eingabe verlangt und diese per Socket an einen Server schickt. Der Server antwortet mit
einem kurzen Satz und der ihm geschickten Eingabe. Ich mochte dass der Client nur 2 Sekunden auf die Antwort vom Server wartet und danch nach der naechsten Eingabe verlangt. Dazu hab ich folgendes Skript:

Code: (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
#!/usr/bin/perl

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

$client = IO::Socket::INET->new (
PeerAddr => '10.10.200.19',
PeerPort => 11011,
Proto => "tcp",
Type => SOCK_STREAM,
Timeout => 4,
);
die "Unable to open connection: $! $@\n"
unless defined $client;

until ( $eingabe =~ /^quit$/ ) {

print "Eingabe bitte: ";
$eingabe=<STDIN>;

$client->send("$eingabe") or die "konnte nicht senden: $! \n";

# hier wird auf Daten gewartet
@ready = IO::Select->new($client)->can_read(2);
if ( @ready ) {
$client->recv($antwort{data},16384);# or next;
print "Serverantwort: $antwort{data}\n";
}
}

close($client);


Wenn der Server direkt antwortet sieht der Verlauf so aus:

Eingabe bitte: erste Eingabe
Serverantwort: Habe folgendes empfangen: erste Eingabe
Eingabe bitte: zweite Eingabe
Serverantwort: Habe folgendes empfangen: zweite Eingabe
Eingabe bitte: dritte Eingabe
Serverantwort: Habe folgendes empfangen: dritte Eingabe
Eingabe bitte: quit

Wenn ich den Server immer erst nach 4 Sekunden antworten lasse, dann bricht der receive zwar ab, aber die Antwort wird auch spaeter vom Server entgegengenommen, was alles durcheinander bringt:

Eingabe bitte: erste Zeile, Server sleep 4 sek.
Eingabe bitte: zweite Zeile, Server sleep 4 sek.
Serverantwort: Habe folgendes empfangen: erste Zeile, Server sleep 4 sek.
Eingabe bitte: dritte Zeile, Server sleep 4 sek.
Serverantwort: Habe folgendes empfangen: zweite Zeile, Server sleep 4 sek.

Die Antwort auf die erste Zeile kommt nachdem die zweite eingegeben wurde, weil auf die Antwort vom Server nicht gewartet wurde. Wie schaffe ich es dass die Antwort vom Server auf die erste Zeile ignoriert wird?
Ich hab hier in allen Foren mit Socket & Select Problemfällen den gestrigen
Tag rumgelesen, aber keine Antwort gefunden.
Last edited: 2012-10-24 11:08:22 +0200 (CEST)

View full thread IO::Socket IO::Select Bei Receive klappt Timeout nicht