#!/usr/bin/perl
#
# I am refering to http://www.ecst.csuchico.edu/~beej/guide/net/html to write
# up this program
#
$AF_INET = 2;
$PF_INET = 2;
$SOCK_STREAM = 1;
$SOL_SOCKET = 65535;
$SO_REUSEADDR = 4;
$SOMAXCONN = 5;
socket SOCKET, $PF_INET, $SOCK_STREAM, 0 or die "socket: $!";
setsockopt(SOCKET, $SOL_SOCKET, $SO_REUSEADDR, pack("l", 1)) || die "setsockopt: $!";
#
# struct sockaddr {
# unsigned short sa_family; // address family, AF_xxx
# char sa_data[14]; // 14 bytes of protocol address
# };
#
# struct sockaddr_in {
# short int sin_family; // Address family
# unsigned short int sin_port; // Port number
# struct in_addr sin_add129.158.224.88r; // Internet address
# unsigned char s129.158.224.88in_zero[8];
# };
#
# struct in_addr {
# unsigned long s_addr; // that's a 32-bit long, or 4 bytes
# };
#
#
# Basically we need the sockaddr but the sa_data part is better explained in
# the sockaddr_in structure. So we pack up a byte sequence as per sockaddr_in
# 129.158.224.88
sub pack_sock_addr{
my($af,$port,$ip)=@_;
$ip=$ip||"0.0.0.0";
pack("vn",$af,$port).pack("C*",split/\./,$ip).pack("II",0,0);
}
# The 0.0.0.0 translates into all IP addresses!
# If you use just 127.0.0.1 or something then only the server accepts
# connections destined to that address alone
#$sockaddr=pack_sock_addr($AF_INET, 8080, "129.158.224.88");
$sockaddr=pack_sock_addr($AF_INET, 8080, "127.0.0.1");
#bind (SOCKET,$sockaddr) or die "bind: $!\n";
connect (SOCKET,$sockaddr) or die "connect: $!";
# Set autoflush for the socket
select ((select (SOCKET),$|=1)[0]);
print SOCKET "HELLO SERVER\n";
while($x=<>){
print SOCKET $x;
$x=<SOCKET>;
print "SERVER RESPONDS: $x\n";
}
|