Perl Cd Bookshelf [Electronic resources] نسخه متنی

اینجــــا یک کتابخانه دیجیتالی است

با بیش از 100000 منبع الکترونیکی رایگان به زبان فارسی ، عربی و انگلیسی

Perl Cd Bookshelf [Electronic resources] - نسخه متنی

| نمايش فراداده ، افزودن یک نقد و بررسی
افزودن به کتابخانه شخصی
ارسال به دوستان
جستجو در متن کتاب
بیشتر
تنظیمات قلم

فونت

اندازه قلم

+ - پیش فرض

حالت نمایش

روز نیمروز شب
جستجو در لغت نامه
بیشتر
لیست موضوعات
توضیحات
افزودن یادداشت جدید



17.5. Setting Up a UDP Server


17.5.1. Problem


You want to write a UDP server.

17.5.2. Solution


First bind to the port on which the server is to
be contacted. With IO::Socket, this is easily accomplished:

use IO::Socket;
$server = IO::Socket::INET->new(LocalPort => $server_port,
Proto => "udp")
or die "Couldn't be a udp server on port $server_port : $@\n";

Then, go into a loop receiving messages:

while ($him = $server->recv($datagram, $MAX_TO_READ, $flags)) {
# do something
}

17.5.3. Discussion


Life with UDP is much simpler than life with TCP. Instead of
accepting client connections one at a time and committing yourself to
a long-term relationship, take messages from clients as they come in.
The recv function returns the address of the
sender, which you must then decode.

Example 17-2 is a
small UDP-based server that just sits around waiting for messages.
Every time a message comes in, we find out who sent it, send that
person a message based on the previous message, and then save the new
message.

Example 17-2. udpqotd


#!/usr/bin/perl -w
# udpqotd - UDP message server
use strict;
use IO::Socket;
my ($sock, $oldmsg, $newmsg, $hisaddr, $hishost, $MAXLEN, $PORTNO);
$MAXLEN = 1024;
$PORTNO = 5151;
$sock = IO::Socket::INET->new(LocalPort => $PORTNO, Proto => 'udp')
or die "socket: $@";
print "Awaiting UDP messages on port $PORTNO\n";
$oldmsg = "This is the starting message.";
while ($sock->recv($newmsg, $MAXLEN)) {
my($port, $ipaddr) = sockaddr_in($sock->peername);
$hishost = gethostbyaddr($ipaddr, AF_INET);
print "Client $hishost said ``$newmsg''\n";
$sock->send($oldmsg);
$oldmsg = "[$hishost] $newmsg";
}
die "recv: $!";

This program is easier using IO::Socket than the raw Socket module.
We don't have to say where to send the message, because the library
keeps track of who sent the last message and stores that information
away on the $sock object. The
peername method retrieves it for decoding.

You can't use the telnet program to talk to this
server. You have to use a dedicated client. One is shown in
Example 17-3.

Example 17-3. udpmsg


#!/usr/bin/perl -w
# udpmsg - send a message to the udpquotd server
use IO::Socket;
use strict;
my($sock, $server_host, $msg, $port, $ipaddr, $hishost,
$MAXLEN, $PORTNO, $TIMEOUT);
$MAXLEN = 1024;
$PORTNO = 5151;
$TIMEOUT = 5;
$server_host = shift;
$msg = "@ARGV";
$sock = IO::Socket::INET->new(Proto => 'udp',
PeerPort => $PORTNO,
PeerAddr => $server_host)
or die "Creating socket: $!\n";
$sock->send($msg) or die "send: $!";
eval {
local $SIG{ALRM} = sub { die "alarm time out" };
alarm $TIMEOUT;
$sock->recv($msg, $MAXLEN) or die "recv: $!";
alarm 0;
1; # return value from eval on normalcy
} or die "recv from $server_host timed out after $TIMEOUT seconds.\n";
($port, $ipaddr) = sockaddr_in($sock->peername);
$hishost = gethostbyaddr($ipaddr, AF_INET);
print "Server $hishost responded ``$msg''\n";

This time when we create the socket, we supply a peer host and port
at the start, allowing us to omit that information in the
send.

We've added an alarm timeout in case the server
isn't responsive, or maybe not even alive. Because
recv is a blocking system call that may not
return, we wrap it in the standard eval block
construct for timing out a blocking
operation.

17.5.4. See Also


The send, recv, and
alarm functions in Chapter 29 of
Programming Perl and in
perlfunc(1); the documentation for the standard
Socket and IO::Socket modules; the section on "Message Passing" in
Chapter 16 of Programming Perl and in
perlipc(1); UNIX Network
Programming
;
Recipe 16.21; Recipe 17.4



17.4. Setting Up a UDP Client17.6. Using Unix Domain Sockets




Copyright © 2003 O'Reilly & Associates. All rights reserved.

/ 875