PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Socket-Programmierung in Perl ohne IO::SOCKET



clumsy
01-11-2005, 16:41
Servus,

ich muss nen Chat in Perl programmieren, ohne jedoch IO::SOCKET zu benutzen. Leider find ich im Netz nirgendwo ne Anleitung. Alles was ich finde, sind Tutorials, die diese API IO::SOCKET nutzen....

Könnt ihr mir ein paar Tips geben, oder kennt ihr ne Seite, wo das erklärt wird. Hab nämlich keine Ahnung von Perl.

THX
clumsy

Molaf
01-11-2005, 17:49
Welche Module stehen denn zur Verfügung?

Und warum kann man IO nicht nutzen, bzw. nicht nachinstallieren?

clumsy
01-11-2005, 18:23
ist ne aufgabe. nur Socket steht zur Verfügung....

Molaf
01-11-2005, 18:53
Öffne doch einfach zwei Shells mit perldoc Socket und perldoc IO::Socket
Die Funktionen sind recht ähnlich, aus dem Vergleich liesse sich dann ja aus den gefundenen Tutorials das nötige herausholen.

clumsy
03-11-2005, 09:09
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...)


#!/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:


#! /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