Всем здравствуйте,возникла необходимость в соственном UDP сервере, взял из кукин бук, сервер слушает 162 UDP порт, и должен писать логи анализируя приходящие пакеты. Т.е. внутри работает regexp на определённое сообщение - если оно приходит то должно записаться в лог всё остальное игнорируется. Соответственно решил проверить сработает ли. Накропал скрипт который по 162 UDP порту (с другой машины) шлёт нужный пакет каждые 10 сек. Сервер пакеты получает но лог не пишет, видимо сообщение под шаблон не подходит. Посмотрел что приходит на 162 порт tcpdump`ом пакеты приходят но содержимого не видно. Ниже скрипт UDP сервера и скрипта который шлёт на него пакеты. Помогите пожалуйста разобраться почему не видно содержимого получаемых пакетов? И почему отсылаемые сообщения могут не подходить под шаблон?
Само сообщение состоит из трёх строк:
1. Then, go into a loop receiving messages:
2. 2006-06-23 13:14:29 0.0.0.0(via 192.168.10.180) TRAP, SNMP v1, community trap
далее всё 3-я строка
3. SNMPv2-SMI::enterprises.303.3.3.19.8.4 Enterprise Specific Trap (8) Uptime: 0:00:00.00
SNMPv2-SMI::enterprises.303.3.3.19.8.1.1 = STRING: "55BJ0005" SNMPv2-SMI::enterprises.303.3.3.19.8.1.2 = STRING: "default
SNMPv2-SMI::enterprises.303.3.3.19.8.1.3 = STRING: "10.1.3.162" SNMPv2-SMI::enterprises.303.3.3.19.8.1.8 = INTEGER: 5
сервер:
------------------------------------------------------------------------------------------
use strict;
use IO::Socket;
my $server_port="162";
my $dlina="1024";
my $server = IO::Socket::INET->new(LocalPort => $server_port,
Proto => "udp") or die "Couldn't be a udp server on port $server_port : $@\n";
my ($date,$time,$type,$vsat,$profile,$ip,$stime,$him,$datagram);
while ($him = $server->recv($datagram, $dlina))
{
if ($him=~/(\d{4}\-\d{2}\-\d{2})\s(\S{8})\s.+\n.+\sTrap\s\(([8]{1})\)\sUptime.+\n.+\sSTRING\:\s\"(\S+)\".+STRING\:\s
\"(\w+)\"\.+STRING\:\s\"(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\".+\sINTEGER\:\s(\d+)/g)
{
$date=$1;$time=$2;$type=$3;$vsat=$4;$profile=$5;$ip=$6;$stime=$7;
open(F,">testing.txt");
print F $date," ",$time," ",$type," ",$vsat," ",$profile," ",$ip," ",$stime," ","VSTAT is UP","\n";
close F;
}
------------------------------------------------------------------------------------------
скрипт для отправки сообщений на 162 порт
------------------------------------------------------------------------------------------
use Socket;
socket(SockHandle, PF_INET, SOCK_DGRAM, getprotobyname("udp"));
$HOSTNAME="local.altegrosky.lan";
$ipaddr="192.168.254.9";
$PORTNO="162";
$MSG="2006-06-23 13:14:29 0.0.0.0(via 172.16.11.161) TRAP, SNMP v1, community trap\nSNMPv2-SMI::enterprises.303.3.3.19.8.4
Enterprise Specific Trap (8) Uptime: 0:00:00.00\nSNMPv2-SMI::enterprises.303.3.3.19.8.1.1 = STRING: '55BJ0005' SNMPv2-SMI::enterprises.303.3.3.19.8.1.2 = STRING: 'default' SNMPv2-SMI::enterprises.303.3.3.19.8.1.3 = STRING: '10.1.3.162' SNMPv2-SMI::enterprises.303.3.3.19.8.1.8 = INTEGER: 5";
$ipaddr=inet_aton($HOSTNAME);
$portaddr=sockaddr_in($PORTNO, $ipaddr);
while (1) {
send(SockHandle,$MSG,0, $portaddr)==length($MSG) or die "cannot send to $ipaddr: $!";
sleep 10;}
-----------------------------------------------------------------------------------------