Hallo nochmal.
Heute habe ich wieder ein anderes Problem.
Ich dachte ich hätte das Problem gelöst, indem ich lokal programmiere und versuche mit normalem IO::Socket zu arbeiten.
Zu meinem Problem:
Ich habe einen Hash in dem Socketverbindungen gespeichert werden.
Jetzt sollen später in alle vorhandenen Socketverbindungen im Hash geschrieben werden.
Das sieht ungefähr so aus:
debug("Erstelle Socket");
$server = IO::Socket::SSL->new(LocalAddr => $HOST,
LocalPort => $PORT,
Proto => 'tcp',
Listen => 10000,
Reuse => 1,
SSL_cert_file => $config{cert_file},
SSL_key_file => $config{key_file},
SSL_ca_file => $config{ca_file},
SSL_ca_path => $config{ca_path}
) or die translate("server_sockerror", { error => $! }) . "\n";
$server->autoflush(1);
$select->add($server);
Und später:
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
sub loop {
foreach our $key( $select->can_read()) { # foreach
if($key eq $server) { # if $bay eq $server
next if $key eq "";
our $bay = $server->accept or next;
my $ip = $bay->peerhost();
my $ident = _uid();
foreach my $key( keys %clients ) {
my $nick = $clients{$key}->{nick};
my $sock = $clients{$key}->{sock};
print "Verbindung von $nick und dem Socket $sock\n";
}
our $buffer = "";
newclient($bay);
$bay->sysread($buffer, 1024);
print "$buffer\n\n";
if($buffer =~ /GET \/\?sid=([a-zA-Z0-9]+)\s/) {
if($1) { # if $1
my $session = $1;
my $safesess = $dbh->quote($session);
my $sta = $dbh->prepare("SELECT session FROM Members WHERE session = $safesess LIMIT 1");
$sta->execute();
my $hassession = $sta->fetchrow_array();
$sta->finish();
$dbh->disconnect();
if($hassession) { # Wenn eine Session existiert dann ..
my %user = loadMemberInfo("", $session);
my $showtime= $user{showtime} == 0 ? 0 : 1;
my $nosmiles= $user{nosmileys} == 0 ? 0 : 1;
my $chatzone = $user{chatzone};
$clients{$ident} = {
sock => $bay,
nick => $user{nick},
sockcreated => &Time::HiRes::time(),
ip => $ip,
lastsrvpost => time,
showtime => $showtime,
nosmileys => $nosmiles,
chatzone => $chatzone,
session => $1,
alivetime => time
};
}
}
}
# Ab hier startet der fork()
defined( my $pid = fork()) or die "fork failed: $!";
$pid and next; # Master
close($server);
Ich habe das $buffer =~ m/GET/ bewusst vor dem Fork() gesetzt, da ich einige Probleme mit übergeben von GLOBS über Storable hatte.
Später soll , wenn der Server eine Nachricht bekommt, in alle Sockets geschrieben werden:
foreach my $ident( keys %clients ) {
my $sock = $clients{$ident}->{sock};
$msg = createFilter($ident, $data);
if( defined $sock ){
$sock->syswrite($msg . "\n");
debug("Sende Nachricht an alle...\n");
}
}
Mit dem normalen IO::Socket::INET hat lokal alles normal funktioniert.
Aber SSL macht hier Probleme. Gibt es irgendwas , was ich beachten muss wenn ich ein $socket->syswrite() in einen SSL Socket mache?
Es kommt folgende Fehlermeldung
write_all VM at entry=vm_unknown
ERROR_SYSCALL(-1): errno()
written so far -1:0 bytes (VM=vm_unknown)
DEBUG: .../IO/Socket/SSL.pm:1203: SSL write errorerror:00000000:lib(0):func(0):reason(0)
Wie gesagt: Lokal alles super mit IO::Socket::INET , aber jetzt Probleme
Wäre dankbar für Hilfe.
Danke