Создание сервера UDP
Проблема
Вы хотите написать сервер UDP.
Решение
Сначала вызовите функцию
bind для номера порта, по которому будет
осуществляться связь с вашим сервером. С модулем IO::Socket это делается просто:
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";
Затем в цикле принимайте сообщения:
while ($him = $server->recv($datagram, $MAX_TO_READ, $flags)) {
# Обработать сообщение
}
Комментарий
Программирование для UDP намного проще, чем для TCP. Вместо того чтобы последовательно
принимать клиентские подключения и вступать в долгосрочную связь с клиентом, достаточно
просто принимать сообщения от клиентов по мере их поступления. Функция
recv возвращает адрес
отправителя, подлежащий декодированию.
В примере показан небольшой сервер UDP, который просто ожидает сообщений. Каждый раз, когда
приходит очередное сообщение, мы выясняем, кто его послал, и отправляем ответ-сообщение с
принятым текстом, после чего сохраняем новое сообщение.
#!/usr/bin/perl -w
# udpqotd - сервер сообщений UDP
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: $!";
С использованием модуля IO::Socket программа получается проще, чем с низкоуровневым
модулем Socket. Нам не приходится указывать, куда отправить сообщение, поскольку библиотека
сама определяет отправителя последнего сообщения и сохраняет его в объекте $sock. Метод
peername извлекает данные для декодирования.
См. такжеОписание функций
send и
recv
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|