Tuesday, December 23, 2008

Sockets in Perl

A Simple Example:
$ perl test.pl
The server had a response line of: HTTP/1.1 200 OK

CODE:
#!/usr/bin/perl -w
use Socket;

#Initialize a socket
my $proto = getprotobyname('tcp');
socket(FH, PF_INET, SOCK_STREAM, $proto) || die $!;

#Establishing a network connection
my $sin = sockaddr_in(80, inet_aton('10.10.2.2'));
connect(FH, $sin) || die $!;

#send the GET method with / as a parameter
my $buffer="GET / HTTP/1.0\n\n";
syswrite(FH, $buffer, length($buffer));

#reading the response
sysread(FH, $return_line, 200);

# print out the response
print "The server had a response line of: $return_line";
close(FH);
1;


Functions Details:


CLIENT SOCKET CALLS
Initializing a Socket:

function name: socket()
parameters: SH - File handle to be associated with newly created socket.
PF_INET - Indicates IP(Internet Protocol) is to be used.
getprotobyname('tcp') - Indicates TCP is to be used on top of IP.
SOCK_STREAM - this indicates the socket is stream oriented as opposed to record oriented.

e.g.: socket(SH, PF_INET, SOCK_STREAM, getprotobyname('tcp')) || die $!;
if the socket call fails, the program should die using the error missage in
$!.

Establishing a Network Connection:

function name: connect()
parameters: Socket::sockaddr_in() - Accepts a port number as first parameter and a 32 bit IP address as the second parameter.
Socket::inet_aton() - translates a hostname string or a dotted decimal string into a 32 bit IP address.


e.g.: my $sin = sockaddr_in(80,inet_aton('www.google.com'));
connect(SH, $sin) || die $!;
sockaddr_in() returns a data structure that is then passed to connect(). From there connect() attempts to establish a network connection to the specified server and port. Upon successful connection it returns a true otherwise it returns a false.


Writing a Data to a Network Connection:

function name: syswrite()
parameters: FH - File handle to write the data to.
$buffer - Data to write is second parameter.
length($buffer) - Third parameter is length of the data to be written.
e.g.: $buffer = "Hello World";
syswrite(FH, $buffer, length($buffer));


function name: print()
parameters: FH - File handle to write the data to.
data - Data to be written.


e.g.: select(FH);
$|=1; # set $| to non-zero to make selection autoflushed
print FH "hello world!";

Reading Data from a Network Connection:
function name: sysread()
parameters: FH - first parameter is a file handle used to specify the connection to read from.
$buffer - Second parameter is a scalar variable store data into.
$num - Third parameter is max number of bytes to read from the connection.

e.g.: sysread(FH, $buffer, 200);

Closing the connection:
close(FH);


SERVER SOCKET CALLS

First create a socket:
my $proto = getprotobyname('tcp');
socket(F, PF_INET, SOCK_STREAM, $proto) || die $!;


Bind the socket with a port number on the machine:
function name: bind()
parameters: F - File handle.
sockaddr_in() - to identify the port for bind().

e.g. my $sin = sockaddr_in(80, INADDR_ANY);
bind(F, $sin) || die $!;

Waiting for a connection:

function name: listen();
parameters: F - File handle.
$length - queue lenght in case of multiple clients trying to connect.

e.g. listen(F, $length) || die $!;

Accepting a connection:
function name: accept();
b FH - File handle accept will associate with a specific network connection.
F - A generic file handle associated with a server socket.

e.g. accept(FH, F) || die $!;