Thread IO::Socket + IO::Select Frage ->blocking (27 answers)
Opened by monti at 2012-02-28 15:25

monti
 2012-02-28 15:25
#156492 #156492
User since
2011-08-05
57 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,
bin immernoch an einem Testskript um Daten auf stdout auszugeben die mir ein embedded Rechner per TCP schickt. Es handelt sich um jeweils eine Zeile Ascii Zeichen die nur mit einem \r abgeschlossen wird.

Nach Problemen mit blockierenden verbindungen (siehe anderer Thread von mir) habe ich jetzt ein Testskript das so aussieht:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/usr/bin/perl

use strict;
use warnings;

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

#$/ = "\r";

print "Server: Starting server\n";

my $port = 12345;
my $host = "localhost";
my $CTIME_String = localtime(time);

my $listen_socket = IO::Socket::INET->new( Listen => 1,
LocalPort => $port,
LocalHost => $host,
Proto => 'tcp',
Blocking => 0,
) or die "Error during creation of listening socket: $!\n";

my $select = new IO::Select($listen_socket);

print "Server: Waiting for client connection on port $port\n";

while (my @ready = $select->can_read)
{
foreach my $connection (@ready)
{

if ($connection == $listen_socket)
{
my $client = $listen_socket->accept();
print "Server: Client $client accepted\n";
$select->add($client);
}
else
{
my $data='';
$data = <$connection>;


if ($data)
{
$CTIME_String = localtime(time);
print "Server: Received: $CTIME_String: $data";
#$connection->send("SERVER: " . $data);
}

else
{
print "Server: Closing connection to $connection\n";
$select->remove($connection);
close($connection);
}
}
}
}


ich kann damit ganz wunderbar zwei telnet sessions parallel öffnen und mir daten aus jeder session schicken und diese werden auch angezeigt.
da das embedded system die zeile jedoch nur mit \r abschließt, blockiert mein readline auf das filehandle ($data = <$connection>;) weil kein newline kommt. ich habe versucht das mit einem $/ = "\r"; zu beginn zu lösen, aber das tut es nicht.

ich stehe mal wieder auf dem schlauch! kann mich jemand in die richtige richtung stoßen?

danke!

grüße

View full thread IO::Socket + IO::Select Frage ->blocking