This is server.pl in view mode; [Download] [Up]
require 'sys/socket.ph'; package server; $verbose = $main'verbose; ($prog = $0) =~ s,.*/,,; sub create { local(*S, $port) = @_; local($name, $aliases, $proto, $this); ($name, $aliases, $proto) = getprotobyname('tcp'); ($name, $aliases, $port) = getservbyname($port, 'tcp') unless $port =~ /^\d+$/; $sockaddr = 'S n a4 x8'; $this = pack($sockaddr, &main'AF_INET, $port, "\0\0\0\0"); socket(S, &PF_INET, &SOCK_STREAM, $proto) || die "socket: $!"; select(S), $| = 1; select(STDOUT); bind(S, $this) || die "bind: $!"; listen(S, 5) || die "connect: $!"; } sub createAnon { local(*S) = @_; local($name, $aliases, $proto, $this, $port, $family, $mySockaddr); $port = 0; $sockaddr = 'S n a4 x8'; $this = pack($sockaddr, &main'AF_INET, $port, "\0\0\0\0"); socket(S, &main'PF_INET, &main'SOCK_STREAM, $proto) || die "socket: $!"; select(S), $| = 1; select(STDOUT); bind(S, $this) || die "bind: $!"; listen(S, 5) || die "listen: $!"; local($mySockaddr) = getsockname(S); ($family, $port, $myAddr) = unpack($sockaddr, $mySockaddr); return $port; } sub accept { local(*NS, *S) = @_; local($addr, $af, $port, $inetaddr, @inetaddr); ($addr = accept(NS,S)) || die "accept: $!"; # print "accept ok \n"; ($af,$port,$inetaddr) = unpack($sockaddr,$addr); @inetaddr = unpack('C4',$inetaddr); # print "$af $port @inetaddr\n"; select(*NS); $| = 1; select(STDOUT); return @inetaddr; } sub connect { local($remote, $port, *S) = @_; local($name, $aliases, $proto, $type, $len); local($remoteaddr, $localaddr, $hostname); local($remote_saddr, $local_saddr, $sockaddr); chop($hostname = `hostname`); $sockaddr = 'S n a4 x8'; ($name,$aliases,$proto) = getprotobyname('tcp'); ($name,$aliases,$port) = getservbyname($port, 'tcp') unless $port =~ /^\d+$/; $remoteaddr = &get_addr_for_host($remote); $localaddr = &get_addr_for_host($hostname); ($name,$aliases,$type,$len,$localaddr) = gethostbyname($hostname); # print "got host $remote port $port\n"; $remote_saddr = pack($sockaddr, &main'AF_INET, $port, $remoteaddr); $local_saddr = pack($sockaddr, &main'AF_INET, 0, $localaddr); socket(S, &main'PF_INET, &main'SOCK_STREAM, $proto) || die "socket: $!"; bind(S, $local_saddr) || die "$prog: bind: $!"; connect(S, $remote_saddr) || die "$prog: connect: $!"; select(S); $| = 1; select(STDOUT); # print "connect returns\n"; } sub get_addr_for_host { local($remote) = @_; local($name, $aliases, $type, $len, $remoteaddr); ($name,$aliases,$type,$len,$remoteaddr) = gethostbyname($remote); if (!$name) { if (@raddr = ($remote =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/)) { ($name,$aliases,$type,$len,$remoteaddr) = gethostbyaddr(pack('C4', split(/\./, $remote)), &main'AF_INET); if ($name) { print "Got name by gethostbyaddr: $name\n" if $verbose;; } else { print "Using packed address ", join('.', @raddr), "\n" if $verbose; $remoteaddr = pack('C4', @raddr); } } else { die "Couldn't find host $remote\n"; } } else { print "got name $name\n" if $verbose; } print "found address ", join('.', unpack('C4', $remoteaddr)), "\n" if $verbose; $remoteaddr; } sub socketpair { local(*MASTER, *SLAVE) = @_; socketpair(MASTER, SLAVE, &AF_UNIX, &SOCK_STREAM, 0) || die "Cannot create socketpair: $!\n"; } 1;
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.