cool, danke! das mit perldoc kannte ich net...
allerdings hab ich nun ein anderes problem. ich will in perl einen mini-chat schreiben. hab den server soweit, dass er lauscht und ne nachricht ausgibt, von wo die verbindung kommt. der client kann sich connecten und bekommt dann vom server ne nachricht auf die console.
wie kann ich aber nun nachrichten hin und her schicken? ich hab's mit print, send und recv und select probiert (bzw. kombinationen davon). aber immer kann ich nur am client empfangen bzw. ausgeben.
hier mal mein server: (hab nicht nur das was drinsteht ausprobiert...)
Code:
#!/usr/bin/perl
use strict;
use Socket;
my $port = shift;
my $nickname = shift;
my $proto = getprotobyname('tcp');
socket(SERVER, PF_INET, SOCK_STREAM, $proto)
or die "Konnte socket nicht erstellen: $!";
setsockopt(SERVER, SOL_SOCKET, SO_REUSEADDR, 1)
or die "setsock: $!";
my $paddr = sockaddr_in($port, INADDR_ANY);
bind(SERVER, $paddr)
or die "bind() hat nicht funktioniert: $!";
listen(SERVER, SOMAXCONN)
or die "listen() hat nicht funktioniert: $!";
print "Talk-Server waiting for connections.\n";
my $client_addr;
my $line;
while($client_addr = accept(CLIENT, SERVER)) {
my ($client_port, $client_ip) = sockaddr_in($client_addr);
my $client_ipnum = inet_ntoa($client_ip);
my $client_host = gethostbyaddr($client_ipnum, AF_INET);
print "got a connection from: $client_host [$client_ipnum]\n";
# send them a message, close connection
# $line = <CLIENT>;
# print $line;
print CLIENT "Hello from the server! \n";
print;
close CLIENT;
# close SERVER;
}
#for ( ; $paddr = accept(CLIENT,SERVER); close Client) {
# my($port,$iaddr) = sockaddr_in($paddr);
# my $name = gethostbyaddr($iaddr,AF_INET);
# print CLIENT "Hello there, it's me now ";
# }
hier der client:
Code:
#! /usr/bin/perl
# talkclient.pl
use strict;
use Socket;
# initialize host and port
my $host = shift;
my $port = shift;
my $nickname = shift;
my $proto = getprotobyname('tcp');
my $line;
# get the port address
my $iaddr = gethostbyname($host);
my $paddr = sockaddr_in($port, $iaddr);
# create the socket, connect to the port
my $sock = socket(TO_SERVER, PF_INET, SOCK_STREAM, $proto)
or die "socket: $!";
connect(TO_SERVER, $paddr) or die "connect: $!";
#while (defined($line = <TO_SERVER>)) {
# print $line;
#}
#close (TO_SERVER) || die "close: $!";
# exit;
while (<TO_SERVER>) {
# send(TO_SERVER, $puffer
print TO_SERVER "huhu, client hier\n";
# select(CLIENT);
# $| = 1;
print CLIENT "Hier ist der client\n";
# select(STDOUT);
# close TO_SERVER;
# print CLIENT "whileschleife\n";
print;
}
close TO_SERVER or die "close: $!";
was ich auch nicht verstehe: wenn ich im server die zeile in der while-schleife "close CLIENT" auskommentiere, dann kommt beim client kein "hello from the server" an. ich ahne zwar, dass es etwas mit der pufferung der streams zu tun hat, aber weiter weiß ich net.
clumsy
Lesezeichen