Guten Tag Zusammen,
ich hänge zur Zeit bei der Programmierung mit dem Module
IO::Socket:SSL schon länger an einem Problem, das ich
einfach nicht in den Griff bekomme.
Und zwar habe ich einen einfachen SSL Server, der Anfragen
eines Clients beantwortet und dann eine entsprechende
Rückmeldung an den Client gibt.
Der Code sieht folgendermaßen aus :
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
# SSL - Server
my $SSL_Server = IO::Socket::SSL -> new(
# Initialisierung der Server - Adresse & des Ports
LocalAddr => '127.0.0.1' ,
LocalPort => 8000 ,
Listen => 10 ,
# Zertifikate für die Authentifizierung
SSL_cert_file => 'D:\PERL\Programmierung\Server\Certs\ca-root.pem',
SSL_key_file => 'D:\PERL\Programmierung\Server\Certs\ca-key.pem',
) or die "failed to listen: $!";
# -----------------------------------------------------------------------------
# Akzeptiere Clients
while( 1 )
{
# Warte auf neue Verbindung
my $Akzeptierung_Verbindung_Clients = $SSL_Server -> accept or die
"Fehler bei der Akzeptierung des Handshakes : !";
# get information about a newly connected client
my $client_address = $Akzeptierung_Verbindung_Clients -> peerhost();
my $client_port = $Akzeptierung_Verbindung_Clients -> peerport();
print "Eingehende Verbindung : $client_address:$client_port" , "\n";
# read up to 1024 characters from the connected client
my $data = "";
$Akzeptierung_Verbindung_Clients -> read( $data , 1024 );
my @Pruefung_Lizenzierung = split( / , / , $data );
print "Ausgabe : $Pruefung_Lizenzierung[ 0 ]" , "\n";
print "Ausgabe : $Pruefung_Lizenzierung[ 1 ]" , "\n";
print "Ausgabe : $Pruefung_Lizenzierung[ 2 ]" , "\n";
my $Server_Rueckmeldung = "OK";
$Akzeptierung_Verbindung_Clients -> print( $Server_Rueckmeldung );
# notify client that response has been sent
shutdown( $Akzeptierung_Verbindung_Clients , 1 );
}
$SSL_Server -> close( );
Der Code ist so OK. Er macht jedenfalls das, was ich vorhatte. Für
Veränderungsvorschläge bin ich natürlich immer offen. :-)
Nun komme ich zu meinem eigentlichen Problem :
Ich habe eine Oberfläche, genauer gesagt ein Systay Icon ( Modul Win32::GUI )
über dessen Menupunkte ich den SSL Server aufrufen möchte.
Wenn ich auf den Menupunkt klicke, wird der Teil des SSL Servers
ausgeführt, also die Sub - Routine, allerdings STOPPT dann das Systray
Icon und bei einem Rechtsklick erscheint das Menu nicht mehr.
Ich weiss, dass es damit zu tun hat, dass während die while Schleife
ausgeführt wird, das "Hauptprogramm" sozusagen wartet, bis die
Schleife beendet wird. Dies ist allerdings ja nie der Fall, da
der SSL Server immer auf neue Client Verbindungen wartet.
Ich habe bereits versucht, es als Modul einzubinden, also als pm.
Ebenfalls habe ich verschiedene Beiträge über parallel laufende
Sub - Routinen gefunden, die allerdings nichts brachten, wie z. B. :
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
#!/usr/bin/perl
use threads;
use threads::shared;
$|=1;
my ($global) : shared ;
my $thr1 = threads->new(\&TEST,1) ;
my $thr2 = threads->new(\&TEST,2) ;
my @ReturnData = $thr1->join ;
print "Thread 1 returned: @ReturnData\n" ;
my @ReturnData = $thr2->join ;
print "Thread 2 returned: @ReturnData\n" ;
sub TEST {
my ( $id ) = @_ ;
for(0..10) {
$global++ ;
print "id: $id >> $_ >> GLB: $global\n" ;
sleep(1) ;
}
return( $id ) ;
}
Ich hoffe ihr versteht, was ich meine & dass ihr
vielleicht einen Tipp für mich habt, wie ich das
bewerkstelligen kann.
Vielen Dank im Voraus !
Viele Grüße
YAPD
Last edited: 2016-03-09 16:20:17 +0100 (CET)
Yet Another Perl Developer