#!/usr/bin/perl -w use strict; package IRC; use POSIX qw(:errno_h); use IO::Socket; use threads ('yield','stack_size'=>16384,'exit'=>'threads_only','stringify'); use threads::shared; sub CLONE_SKIP{1} #Neues IRC-Objekt sub new($$$) { my $class =shift or return; my $self ={}; my $sock_opt =shift; my $irc_opt =shift; bless($self,$class); $self->{'sock_opt'} =$sock_opt if($sock_opt && ref($sock_opt) eq 'HASH'); $self->{'irc_opt'} =$irc_opt if($irc_opt && ref($irc_opt) eq 'HASH'); return $self; } #IRC-Verbindung oeffnen. sub open($$$) { my $self =shift or return; my $sock_opt =shift or undef; my $irc_opt =shift or undef; $self->{'sock_opt'} =$sock_opt if($sock_opt); $self->{'irc_opt'} =$irc_opt if($irc_opt); $self->{'socket'}=IO::Socket::INET->new(%{$self->{'sock_opt'}}); $self->{'socket_input'}=''; #XXX: Hier ist $self noch IRC=HASH ... print "1: Hauptthread, die Welt ist in Ordnung:\n"; print "1: \$self und \$self->{'socket'}\n"; print "1: $self und $self->{'socket'}\n"; my $thr=threads->create('run',$self) or die "1: $!\n"; $thr->detach();# or die "2: $!\n"; } #Daten vom Socket erhalten sub get_response($) { my $self=shift or return ''; my $tmp=$self->{'socket_input'}; $self->{'socket_input'}=''; return $tmp; } sub run($) { my $self=$_[0] or return; #XXX: Hier nicht mehr: print "2: Unterthread zum Einlesen von Socketdaten, aber ich habe mein Blessing verloren ...\n"; print "2: \$self\n"; print "2: $self\n"; #Diese Anweisung fuehrt dazu, dass der Thread unweigerlich kaputt geht, weil $self sein Blessing verloren hat. print "Hier stirbt der Thread immer, da \$self->{'socket'} nicht mehr existiert\n"; my $socket=$self->{'socket'} or return; #Normalerweise sonst aus dem Socket lesen. my $input; while($input=<$socket>) { $input=~s#\r##sg; $self->{'socket_input'}.=$input; } } #Nun Wechsel zum normalen Programm. package main; #Neuen IRC-Handler erstellen, Verbindung aufbauen und Antwort (in der Regel sowas wie 'Verifiziere den Hostnamen' oder in der Art) erhalten und ausgeben. my $irc_handler=IRC->new(); $irc_handler->open({'PeerAddr'=>'gibtesnicht.net','PeerPort'=>6667,'Proto'=>'tcp'},{'IRCNick'=>'Bernd','IRCOwners'=>'Bernd','IRCChannels'=>'#myownchannel'}); print $irc_handler->get_response()."\n";