Writing a TCP Server
Problem
You want to write a server that waits for clients to connect over the network to a particular port.
Solution
This recipe assumes you’re using the Internet to communicate. For TCP-like communication within a single Unix machine, see Section 17.6.
Use the standard (as of 5.004) IO::Socket::INET class:
use IO::Socket; $server = IO::Socket::INET->new(LocalPort => $server_port, Type => SOCK_STREAM, Reuse => 1, Listen => 10 ) # or SOMAXCONN or die "Couldn't be a tcp server on port $server_port : $@\n"; while ($client = $server->accept()) { # $client is the new connection } close($server);
Or, craft it by hand for better control:
use Socket; # make the socket socket(SERVER, PF_INET, SOCK_STREAM, getprotobyname('tcp')); # so we can restart our server quickly setsockopt(SERVER, SOL_SOCKET, SO_REUSEADDR, 1); # build up my socket address $my_addr = sockaddr_in($server_port, INADDR_ANY); bind(SERVER, $my_addr) or die "Couldn't bind to port $server_port : $!\n"; # establish a queue for incoming connections listen(SERVER, SOMAXCONN) or die "Couldn't listen on port $server_port : $!\n"; # accept and process connections while (accept(CLIENT, SERVER)) { # do something with CLIENT } close(SERVER);
Discussion
Setting up a server is more complicated than being a client. The
optional listen
function tells the operating
system how many pending, unanswered connections to queue up waiting
for your server. The setsockopt
function used in the Solution allows you to avoid waiting two ...
Get Perl Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.