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

monti
 2012-11-26 12:06
#163605 #163605
User since
2011-08-05
57 Artikel
BenutzerIn
[default_avatar]
Ich habe jetzt mal meine Schleife umgeschrieben und sie sieht nun so aus:

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
while (1)
{
foreach my $connection (my @can_read = $select->can_read(5))
{
if ($connection == $listen_socket)
{
my $client = $listen_socket->accept();
$select->add($client);

$client->recv($data,1024);
if ($data) {
my @received = unpack('C*', $data);
my $id=join('', map {sprintf('%02x', $_)} @received);

if (exists($con_hash{ $id })) {
if ($con_hash{ $id } != $client) {
&do_log("ID $id changed socket from $con_hash{ $id } to $client, updating entry");
$con_hash{ $id }=$client;
}
else {
&do_log("ID $id re-connected on same socket $client");
}
}
else {
if ($id) {
&do_log("Creating connection entry for ID $id");
$con_hash{ $id }=$client;
while( my ($k, $v) = each %con_hash ) {
&do_log ("Connected ID: $k, socket: $v");
}
}
else {
&do_log("ERROR: Something is wrong");
}
}

}
else {

&do_log("ERROR: Something else is wrong");
}
}
else
{

&do_log("Closing connection to $connection");
while( my ($key, $value) = each %con_hash ) {
if ($value == $connection) {
&do_log("Deleting connection entry for ID $key");
delete $con_hash{$key};
}
}
while( my ($k, $v) = each %con_hash ) {
&do_log ("Connected ID: $k, socket: $v");
}


$select->remove($connection);
close($connection);


}
}

foreach my $connection (my @can_write = $select->can_write(5))
{
my @send_dec=qw(T E S T);
my $send_hex=pack('C*', @send_dec);

while( my ($con_id, $sock) = each %con_hash ) {
&do_log("Sending data to ID $con_id via socket $sock: ".join('', map {sprintf('%02x', $_)} @send_dec));
$sock->send($send_hex);
$sock->recv($data,1024);
my @recv_dec = unpack('C*', $data);
&do_log("Received data from ID $con_id via socket $sock: ".join('', map {sprintf('%02x', $_)} @recv_dec));
}
}
sleep (5);
}


Es funktioniert soweit besser als vorher.
Etwas ist mir noch unklar. Wenn ich mit telnet connecte und daten sende, wird ein hash Eintrag gemäß meiner zuerst gesendeten Daten angelegt. Soweit so gut.
Wenn ich dann nichts mehr tue, sendet er alle 5s TEST. Wenn ich jetzt aber disconnecte, dann löscht er meine ID im hash und schließt die Verbindung, aber die Endlosschleife wird nicht mehr ausgeführt. Wenn ich vor das sleep(5) eine Debugausgabe einbaue, passiert nichts. Erst wenn ich nochmal connecte, wird das sleep(5) wieder ausgeführt.
Das verstehe ich nicht, wieso ist das so? Sollte bei nicht vorhandenen Verbindungen die Schleife nicht so "aussehen"?

Code: (dl )
1
2
3
4
while(1) {
&do_log("DEBUG");
sleep(5);
}

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