Schrift
[thread]4298[/thread]

Netzwerkprogrammierung: HILFE ! ! !: Beispiele aus dem Buch gehen nicht...



<< >> 7 Einträge, 1 Seite
renee
 2005-07-14 00:39
#37631 #37631
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das hier funktioniert bei mir:
Code: (dl )
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
#!/usr/bin/perl
use strict;
use warnings;
#Pragmas einbinden

#IO::Socket Modul einbinden, mit DEFAULT und CRLF
use IO::Socket qw(:DEFAULT :crlf);

#Konstante definieren
use constant MY_PORT => '2050';

#CRLF als Zeilenende verwenden
#$/ = CRLF;

#$quit deklarieren
my $quit = 0;

#STRG+C abfangen
$SIG{'INT'} = sub { $quit++; };

#$port Wert zuweisen
my $port = shift || MY_PORT;

#IO::Socket Objekt erzeugen
my $socket = IO::Socket::INET->new(

Listen => 20,

LocalPort => $port,

Timeout => 60*60,

Reuse => 1) || die

"Konnte Socket Objekt nicht erzeugen: $!";

warn "Warte auf ankommende Verbindung auf Port $port...\n";

#Schleife, wenn $quit nicht wahr ist
while(!$quit) {

#Verbindungen akzeptieren
next unless my $session = $socket->accept;

#Peer host identifizieren
my $peer = gethostbyaddr($session->peeraddr,AF_INET) || $session->peerhost;

#Verbindungsport überprüfen
my $Port = $session->peerport;

#Meldung ausgeben
warn "Verbindung von $peer, $Port\n";

#Schleife, was bei einer Verbindung passiert
while(<$session>) {
my $msg_out = $_;
print $session $msg_out;
}

#Verbindungsende ausgeben
warn "Verbindung von $peer, $Port beendet...\n";

#Session schließen
close($session);
}

#Socket schließen
close $socket;


Client:
Code: (dl )
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
#!/usr/bin/perl
use strict;
use warnings;
#Pragmas einbinden

#IO::Socket einbinden
use IO::Socket qw(:DEFAULT :crlf);

#Konstante definieren
use constant MY_HOST => '127.0.0.1';
use constant MY_PORT => '2050';

#Variablen deklarieren
my $host = shift || MY_HOST;
my $port = shift || MY_PORT;

#IO::Socket Modul erzeugen
my $socket = IO::Socket::INET->new("$host:$port") ||
die "Fehler beim Socket öffnen: $!";

#Schleife, für die Kommunikation
while(defined(my $msg_out = <STDIN>)) {

#Nachricht verschicken
print $socket $msg_out;

#Nachrichten empfangen
my $msg_in = <$socket>;

#Nachricht ausgeben
print $msg_in;
}

#Socket schließen
$socket->close || warn "Fehler beim schließen des Sockets: $@";

warn "Verbindung beendet..\n";
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
J-jayz-Z
 2005-07-14 19:17
#37632 #37632
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hat jemand ne idee, wieso man in diesem snippet 2mal enter drücken muss, zur bestätigung?
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
....
#Schleife, für die Kommunikation
while(defined(my $msg_out = <STDIN>)) {

#Verschlüsseltes Passwort
if ($msg_out =~ /Pw: (.*)\n/) {
my $temp = $1;
my $passwd = crypt("$temp", "oO");
print $socket "Pw: $passwd";
} else {

#Nachricht verschicken
print $socket $msg_out;

#Nachrichten empfangen
my $msg_in = <$socket>;

#Nachricht ausgeben
print $msg_in;
}
}
....

danke euch mal im vorraus...
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
J-jayz-Z
 2005-07-14 22:38
#37633 #37633
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hatte ich auch versucht. Is nicht...
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
J-jayz-Z
 2005-07-14 00:13
#37634 #37634
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi,

ich hab da ein großes Problem was Netzwerkprogrammierung angeht.
Und zwar hab ich das Buch "Netzwerkprogrammierung in Perl" hier und versuche mich darin einzuarbeiten. Nur wie soll ich das machen, wenn sogar die beispiele nicht gehen... :ghostface:
Ich hab den Echo Server etwas kommentiert und sonst inhaltlich aus dem Buch nur sachgemäß angepasst.
Hier mein funktionierender Server:
Code: (dl )
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
#!/usr/bin/perl
use strict;
use warnings;
#Pragmas einbinden

#IO::Socket Modul einbinden, mit DEFAULT und CRLF
use IO::Socket qw(:DEFAULT :crlf);

#Konstante definieren
use constant MY_PORT => '2050';

#CRLF als Zeilenende verwenden
$/ = CRLF;

#$quit deklarieren
my $quit = 0;

#STRG+C abfangen
$SIG{'INT'} = sub { $quit++; };

#$port Wert zuweisen
my $port = shift || MY_PORT;

#IO::Socket Objekt erzeugen
my $socket = IO::Socket::INET->new(

Listen => 20,

LocalPort => $port,

Timeout => 60*60,

Reuse => 1) || die

"Konnte Socket Objekt nicht erzeugen: $!";

warn "Warte auf ankommende Verbindung auf Port $port...\n";

#Schleife, wenn $quit nicht wahr ist
while(!$quit) {

#Verbindungen akzeptieren
next unless my $session = $socket->accept;

#Peer host identifizieren
my $peer = gethostbyaddr($session->peeraddr,AF_INET) || $session->peerhost;

#Verbindungsport überprüfen
my $Port = $session->peerport;

#Meldung ausgeben
warn "Verbindung von $peer, $Port\n";

#Schleife, was bei einer Verbindung passiert
while(<$session>) {
my $msg_out = $_ . CRLF;
print $session $msg_out;
}

#Verbindungsende ausgeben
warn "Verbindung von $peer, $Port beendet...\n";

#Session schließen
close($session);
}

#Socket schließen
close $socket;

funktioniert mit Telnet einwandfrei...
Hier mein Client, der nicht funktioniert. Es werden keine Daten an das Socket geschickt...
Code: (dl )
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
#!/usr/bin/perl
use strict;
use warnings;
#Pragmas einbinden

#IO::Socket einbinden
use IO::Socket qw(:DEFAULT :crlf);

#Konstante definieren
use constant MY_HOST => '127.0.0.1';
use constant MY_PORT => '2050';

#Variablen deklarieren
my $host = shift || MY_HOST;
my $port = shift || MY_PORT;

#IO::Socket Modul erzeugen
my $socket = IO::Socket::INET->new("$host:$port") ||
die "Fehler beim Socket öffnen: $!";

#Schleife, für die Kommunikation
while(defined(my $msg_out = STDIN->getline)) {

#Nachricht verschicken
print $socket $msg_out;

#Nachrichten empfangen
my $msg_in = <$socket>;

#Nachricht ausgeben
print $msg_in;
}

#Socket schließen
$socket->close || warn "Fehler beim schließen des Sockets: $@";

warn "Verbindung beendet..\n";

Wäre es vielleicht möglich, das mir jemand, mein client verbessert, oder einfach einen neuen, funktiobierenden, schreibt?
Dank euch schonmal für eure Hilfe!
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
J-jayz-Z
 2005-07-14 01:15
#37635 #37635
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Danke renee, funktioniert einwandfrei. Nur wieso geht es mit der Konstante CRLF nicht?
Soll ja den Zeilenumbruch so ersetzen, das es über die Socket Kommunikation keine Probleme mehr damit gibt...
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
renee
 2005-07-14 22:22
#37636 #37636
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Beim ersten Enter wird einfach nur das Passwort herausgefiltert und Du schickst einfach einen String an den Server, ohne die Zeile zu beenden!

Erst beim zweiten Enter, das direkt an den Server gesendet wird, erkennt der Server das Zeilenende!

Du musst also schon ein \n mitschicken, wenn Du das Passwort an den Server sendest!
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2005-07-14 23:02
#37637 #37637
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Nimm auch mal das Lesen vom Socket aus dem else-Teil raus...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< >> 7 Einträge, 1 Seite



View all threads created 2005-07-14 00:39.