Thread CLONE_SKIP 'verteufelt' Referenzen auf Objekte - wie vermeiden? (3 answers)
Opened by Bernd at 2013-01-01 10:59

topeg
 2013-01-01 11:52
#164570 #164570
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Der Trick dabei ist den Socket nonblocking zu machen und trotzdem viel zu lesen:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use IO::Socket::INET;

sub make_socket
{
  return IO::Socket::INET->new(
      PeerAddr => '127.0.0.1',
      PeerPort => 12345,
      Proto    => 'tcp',
      Blocking => 0, # <=== das wichtige
    );
}

sub read_if_possible
{
  my $socket=shift;
  my $buf;
  my $data='';
  while (sysread($server, $buf, 4096))
  { $data .= $buf; }
  return $data;
}

sysread gibt die Anzahl der gelesenen Bytes zurück. Bei non-blocking Sockets ist differiert das zu den angeforderten Bytes.

Zu Therads:
Du kannst nur einzelne Variablen zwischen Threads teilen. Wenn du versuchst Strukturen wie Objekte oder Hashreferenzen zu sharen funktioniert das nicht richtig. Willst du also den Socket in mehreren Threads haben, so musst du explizit den Socket sharen und im Objekt auch so behandeln.

Damit du das Rad nicht neu erfinden musst schau dir einfach mal an wie es in CPAN:Net::IRC gemacht wurde. Auch wenn es nicht mehr gepflegt wird kann es dir doch helfen eine Lösung zu finden. Wenn du Lust hast kannst du auch den Code nehmen und für dich in Ordnung bringen.

Dann gibt es noch Module die das machen:
CPAN:POE::Component::IRC
CPAN:Bot::BasicBot mit Bot::BasicBot::IRC
CPAN:AnyEvent::IRC::Client

Suche einfach mal auf cpan.

View full thread CLONE_SKIP 'verteufelt' Referenzen auf Objekte - wie vermeiden?