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
80
81
82
83
84
85
86
#!/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";
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; }