>Народ, писал на "С" для сокетов.
>Все прекрасно. А как енто
>все работает на perlе?
Практически так же как и на Си, с небольшим отклонением синтаксиса.
Как клиента писать можно подчерпнуть из множества скриптов, сервер пишется примерно так:
use Socket;
sub AF_INET {
return 2;
}
sub SOCK_STREAM {
return 1;
}
socket(S,AF_INET,SOCK_STREAM,$protocol) || die "socket : $!";
setsockopt(S,SOL_SOCKET,SO_REUSEADDR,1) || die "setsockopt : $!";
setsockopt(S, IPPROTO_TCP, TCP_NODELAY, 1) || die "setsockopt : $!";
setsockopt (S, SOL_SOCKET, SO_LINGER, 0);
setsockopt(S, SOL_SOCKET,SO_KEEPALIVE, 1) || die "setsockopt : $!";
my($sockaddr) = 'S n a4 x8';
my($this) = pack($sockaddr, AF_INET, $port, "\0\0\0\0");
while (!(bind(S, $this))) {
if (! -t STDIN) { print "<br>\n"; }
print "Waiting for port $port to free\n";
exit;
sleep(5);
}
listen(S, 50) || die "listen: $!";
select(S);
$| = 1;
select(STDOUT);
my($con) = 0;
my($locs);
if (fork()) {
exit;
}
close(STDIN);
close(STDOUT);
close(STDERR);
while (1) {
$rin = $win = $ein = '';
vec($rin, fileno(S), 1) = 1;
($numready, $timeleft) = select($rout=$rin, undef, undef, undef);
if (vec($rout, fileno(S), 1)) {
$con ;
local *SOCKET;
if(($addr = accept(SOCKET, S))) {
$sockets{$con} = *SOCKET;
select($sockets{$con});
$|=1;
select(STDOUT);
($af,$cport, $inetaddr) = unpack($sockaddr, $addr);
undef $host;
if (defined($thesocket) && vec($rout, fileno($thesocket), 1)){
$data = substr(&readline($thesocket,0),0,1024);
}
}
}