Thread Client und Server für TCP und UDP (17 answers)
Opened by ITobiI at 2015-09-10 11:56

ITobiI
 2015-09-10 11:56
#182127 #182127
User since
2015-09-10
70 Artikel
BenutzerIn
[default_avatar]
Hi,
ich muss vorweg nehmen das ich zum ersten mal mit Perl programmiere. Ich soll je einen Client und einen Server für UDP und TCP programmieren. Ich habe das Problem wenn ich den TCP-Client starten will kommt immer die Fehlermeldung: "Invalid Argument". Könntet ihr euch auch die anderen Skripte anschauen, ob die soweit in Ordnung sind? Danke schonmal im voraus.
Code (perl): (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
#!/usr/bin/perl -w

#UDP_Server.pl

#Hartych, Tobias EIT 4056051
#Dreißig, Tobias EIT 40?????

#Module importieren
use strict 'vars'; #strict macht debugging einfacher

use IO::Socket::INET;#Modul wird benoetigt um Netzwerkfunktionen zu nutzen

#auto-flush
$| = 1;

#Variablen deklarieren
my ($socket, $message,$peer_address,$peer_port);

#bekomme ip und port von Kommandozeilenparamter
my $ip=$ARGV[0]; #erste Paramenter wird in $ipaddr eingespeichert
my $port = $ARGV[1]; #zweite Paramenter wird in $ipaddr eingespeichert

#Socket erschaffen zur Kommunikation mit Client
$socket=new IO::Socket::INET(
LocalHost =>$ip,#LocalHost von $socket ist eingegebener Paramenter $ip
LocalPort=>$port,#LocalPort von $sock ist eingegebener Paramenter $port
Proto=>'udp'#Transportprotokoll: UDP
);
die "Konnte keine Verbindung herstellen: $!\n" unless $socket; #wenn fehlgeschlagen dann schließen

print "UDP Server bereit und wartet auf eine Verbingung mit Port $port\n";



#Hauptschleife  
while(1)
{
#empfange bis zu 1024 bytes von client, packe empfangene Daten in $message Variable     
        $socket->recv($message,1024);
        #definiere ip
        $peer_address = $socket->peerhost();
        #definiere port
        $peer_port = $socket->peerport();
        #sende $message zurueck zu client
        $socket->send($message);

}
#Schließe Socket
$socket -> close();                                  


Code (perl): (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
#!/usr/bin/perl -w

#UDP_Client.pl

#Hartych, Tobias EIT 4056051
#Dreißig, Tobias EIT 40?????

#Module importieren
#strict macht debugging einfacher
use strict; 

;#Modul wird benoetigt um Netzwerkfunktionen zu nutzen
use IO::Socket::INET

#auto-flush
$| = 1;

#Variablen deklarieren
my ($socket,$data,$ip,$port);
$ip=$ARGV[0]; #erster Paramenter wird in $ipaddr eingespeichert
$port = $ARGV[1]; #zweiter Paramenter wird in $ipaddr eingespeichert


#Socket erschaffen zur Kommunikation mit Server
$socket=new IO::Socket::INET
(
                                
PeerAddr=>$ip,  #PeerAddr von $sock ist eingegebener Paramenter $ipaddr
                                
PeerPort=>$port,        #PeerPort von $sock ist eingegebener Paramenter $port
                                
Proto=>'udp'            #Transportprotokoll: UDP
                                
);

die "Konnte keine Verbindung herstellen: $!\n" unless $socket;


print "Mit $ip verbunden !\n";
        
print "Bitte Text zum Senden eingeben:\n";

#Hauptschleife  
while(1)
{       
#Eingabe der Daten
$data = <STDIN>;
print "Sende Daten zum Server...";
$socket->send($data, 1024);

#Warte auf Antwort vom Server
$socket->recv($data, 1024);
print("Empfangene Daten: $data \n");
}

$socket -> close();     


Code (perl): (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 -w

#TCP_Server.pl

#Hartych, Tobias EIT 4056051
#Dreißig, Tobias EIT 40?????

use strict; #strict macht debugging einfacher
use IO::Socket::INET; #nutze Modul IO::Socket::INET um einen neuen Socket zu erschaffen

#auto-flush
$| = 1;

#Variablen deklarieren
my ($socket,$connection,$data); 
my($peeradr,$peerport);

#bekomme server-ip und server-port von Kommandozeilenparamter

my $ipAddress = $ARGV[0];   #erster Paramenter wird in $ipAddress eingespeichert                                               

my $NPort = $ARGV[1];       #zweiter Paramenter wird in $NPort eingespeichert                                             

$socket = new IO::Socket::INET(                                         

LocalHost => $ipAddress,  #LocalHost von $socket ist eingegebener Paramenter $ipAddress                                                
LocalPort => $NPort,      #LocalPort von $socket ist eingegebener Paramenter $NPort                                              
Proto => 'tcp',           #Transportprotokoll: TCP
Listen => 5,              #maximale Anzahl von Client's ist 5                                   
Reuse => 1                              

);
die "Fehler beim erstellen des Socket's: $! \n" unless $socket;


#Hauptschleife
while (1)

{

          print "Warte auf Verbindung mit Client ..\n";

          $connection = $socket->accept(); #Warte auf Verbindung zum Client / Akzeptiere eingehende Client Verbindung

          $peeradr = $connection -> peerhost();     

#definiere IP-Adresse von Client       

          $peerport = $connection -> peerport(); 
    
          print "Verbindung mit client: $peeradr:$peerport\n";  

                                  
#Lies bis zu 1024 Bytes vom verbundenen Client
$data = "";
$connection->recv($data, 1024);
print "Empfangene Daten: $data\n";

#Schreibe Antwort zu verbundenen Client
print "Antwort:\n";
$data = <STDIN>;
$connection->send($data);

#Informiere Client das Antwort gesendet wurde
shutdown($connection, 1);
}

#Schließe Socket -> schliesse Verbindung zum Client
$socket->close();


Code (perl): (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
#!/usr/bin/perl -w

#TCP-Client
#Hartych, Tobias EIT 4056051
#Dreißig, Tobias EIT 40?????

use strict; #strict macht debugging einfacher
use IO::Socket::INET; #nutze Modul IO::Socket::INET um einen neuen Socket zu erschaffen

#auto-flush
$| = 1;

#Variablen deklarieren
my ($socket,$response,$size,$req);


#bekomme server-ip und server-port von Kommandozeilenparamter
my $peeradr = $ARGV[0]; #erster Paramenter wird in $PeerAdress eingespeichert           

my $peerport = $ARGV[1];        #zweiter Paramenter wird in $PeerPort eingespeichert            

$socket = new IO::Socket::INET
(               
PeerHost => $peeradr,    #PeerAddr von $socket ist eingegebener Paramenter $PeerAdress
PeerPort => $peerport,   #PeerPort von $socket ist eingegebener Paramenter $PeerPort    
Proto => 'tcp',          #Transportprotokoll: TCP
);
die "Fehler bei erstellen des Socket's: $!\n" unless $socket;

print "\nVerbindung mit Server erfolgreich!\n";


#Daten, welche zum Server gesendet werden
$req = <STDIN>;
$size = $socket->send($req);
print "sende Daten mit einer Laenge von $size\n";

#informiere Server das Daten gesendet wurden
shutdown($socket, 1);

#erhalte eine Antwort von bis zu 1024 Bytes vom Server 
$response = "";
$socket->recv($response, 1024);
print "Erhaltene Antwort\n";    

#Schließe Socket
$socket -> close();


modedit Editiert von GwenDragon: Code formatiert
Last edited: 2015-09-10 12:10:29 +0200 (CEST)

View full thread Client und Server für TCP und UDP