#!/usr/bin/perl -Tw use strict; BEGIN { $ENV{PATH} = "/usr/bin:/bin" } use Socket; use Carp; my $EOL = "\015\012"; sub logmsg { print "$0 $$: @_ at ", scalar localtime(), "\n" } my $port = shift || 2345; die "invalid port" unless $port =~ /^ \d+ $/x; my $proto = getprotobyname("tcp"); socket(Server, PF_INET, SOCK_STREAM, $proto) || die "socket: $!"; setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) || die "setsockopt: $!"; bind(Server, sockaddr_in($port, INADDR_ANY)) || die "bind: $!"; listen(Server, SOMAXCONN) || die "listen: $!"; logmsg "server started on port $port"; my $paddr; $SIG{CHLD} = \&REAPER; for ( ; $paddr = accept(Client, Server); close Client) { my($port, $iaddr) = sockaddr_in($paddr); my $name = gethostbyaddr($iaddr, AF_INET); logmsg "connection from $name [", inet_ntoa($iaddr), "] at port $port"; print Client prelen( "Hello there, $name, it's now ", scalar localtime(), $EOL ); print Client prelen( 'backslash \n__'."\n" ); print Client prelen( 'backslash \r\n'."\r\n" ); print Client prelen( 'backslash EOL_'.$EOL ); } sub prelen { my $str = join '',@_; my $len = length $str; return "($len+6)$str"; } #### #!/usr/bin/perl -w use strict; use Socket; my ($remote, $port, $iaddr, $paddr, $proto, $line); $remote = shift || "localhost"; $port = shift || 2345; # random port if ($port =~ /\D/) { $port = getservbyname($port, "tcp") } die "No port" unless $port; $iaddr = inet_aton($remote) || die "no host: $remote"; $paddr = sockaddr_in($port, $iaddr); $proto = getprotobyname("tcp"); socket(SOCK, PF_INET, SOCK_STREAM, $proto) || die "socket: $!"; connect(SOCK, $paddr) || die "connect: $!"; binmode SOCK or die "binmode $!"; ## no effect on client side while ($line = ) { my $length = length $line; print "($length)$line"; } close (SOCK) || die "close: $!"; exit(0); __END__ $ perl client.pl (65)(59+6)Hello there, localhost, it's now Wed Sep 14 03:53:10 2011 (21)(15+6)backslash \n__ (22)(16+6)backslash \r\n (22)(16+6)backslash EOL_