hotti: Hilfe bei TCP Server/Client

Beitrag lesen

hi,

Der Client sollte auch sehr lange Zeichen(ketten) fehlerfrei an den Server übertragen können. Die Rede ist von 500 Zeilen z.B. eines Textes. Mit <STDIN> stösst man da schon an seine Grenzen. Nun wurde mehrfach in diesem Zusammenhang die Benutzung von Threads erwähnt. Da wir allerdings zu Perl absolut keine Vorlesung hatten, hoffe ich das hier jemand Rat hat.

In der Welt der Handler gibt es keine Zeichenketten, sondern nur noch Bytes. Was die Bytes darstellen ist völlig Wurscht ;)

Auch folgende Möglichkeiten könnte man in Betracht ziehen, fork(), select könnte ganz nützlich sein.

Wenn der Server mehrere Connections handeln soll, ist fork() angesagt. Teste mal ohne fork() nur eine Connection, Code untenstehend und teste die 'Grenzen' aus:

  
############### server  
#!/usr/bin/perl  
  
###########################################################################  
# Server, der an einem bestimmten Port lauscht  
###########################################################################  
use strict;  
use IO::Socket qw(SOMAXCONN);  
  
$| = 1;  
  
my $port = 9999;  
  
my $server_sock = IO::Socket::INET->new(  
	LocalPort => $port,  
	Listen => SOMAXCONN,  
	Proto => 'TCP',  
	Reuse => 1,  
) or die "Kann Socket nicht aufbauen";  
  
  
print "Warte auf Daten an Port $port\n\n";  
  
while(my $peer = $server_sock->accept){  
	while(read $peer, my $data, 1024){  
		print $data;  
	}  
	$peer->close;  
}  
  
############### client  
#!/usr/bin/perl  
  
###########################################################################  
# Einfacher Client, der in ein Socket schreibt  
###########################################################################  
use strict;  
use IO::Socket;  
  
my $socket = new IO::Socket::INET (  
	PeerAddr => 'localhost',  
	PeerPort => 9999,  
	Proto    => 'tcp'  
) or die "Kein Socket bekommen!";  
  
binmode $socket;  
  
print $socket "123456789\n123456789\n123456789\n123456789\n123456789\n123456789\n123456789\n123456789\n";  
  
foreach my $buffer(1..1000){  
	$socket->print($buffer);  
}  
  
$socket->close;