Написал простой сокет для UDP пакетов. Под виндой все отлично работаетuse strict;
use IO::Socket;
my($sock, $oldmsg, $newmsg, $hisaddr, $hishost, $MAXLEN, $PORTNO);
$MAXLEN = 1024;
$PORTNO = 137;
$sock= IO::Socket::INET->new(LocalPort=>$PORTNO, Proto=>'udp') or die "socket: $@";
while ($sock->recv($newmsg, $MAXLEN))
{
print $newmsg;
}Пытаюсь запустить по UNIX но получаю ишибку всегда :
socket: IO::Socket::INET: Bad protocol 'udp' at UDP_recv2.pl line 9.
В чем дело?
-----------------------------------
Так же есть серверuse Socket;
socket(SockHandle, PF_INET, SOCK_DGRAM, getprotobyname("udp"));
$HOSTNAME="tratata";
$ipaddr="175.37.10.50";
$PORTNO="137";
$MSG="HELP-HELP-HELP-HELP";
$ipaddr=inet_aton($HOSTNAME);
$portaddr=sockaddr_in($PORTNO, $ipaddr);
while (1) {
print "Send\n";
send(SockHandle,$MSG,0, $portaddr)==length($MSG)";
sleep 5;}Программа вроде работает по UNIX но ничего не шлет в сеть. Подскажите где ошибки плиз.
>Написал простой сокет для UDP пакетов. Под виндой все отлично работает
Не знаю почему у тебя не запускается. Может ты модуль не правильно установил? IO::Socket
?
У меня работает, только вывод не печатает,
наверное буфферизирует.
но если поставить:
print "msg:$newmsg\n";
все выводит.Сервер тоже рабочий, только
send(SockHandle,$MSG,0, $portaddr)==length($MSG)";
не правильная лучше так
send(SockHandle,$MSG,0, $portaddr) or die("Send failed\n");Да, я тестировал не под суперюзером и порт назначил 1370. может у тебя из за этого бага?
Модуль не устанавливал. Использую стандартный. По прежнему при попытке компиляции приемника возникает ошибка socket: IO::Socket::INET: Bad protocol 'udp' . Причем если протокол поменять на tcp то все равно ошибка. Хренотень какая-то.
>Модуль не устанавливал. Использую стандартный. По прежнему при попытке компиляции приемника возникает
>ошибка socket: IO::Socket::INET: Bad protocol 'udp' . Причем если протокол поменять
>на tcp то все равно ошибка. Хренотень какая-то.каким пользователем работаешь?
если не рутом то тебе не разрешено открывать порты < 1024.
нет не рутом, попробовал 1370, результат тот же
Весьма странная ошибка.
Что пишет cat /etc/protocols | grep -i udp ?
>Весьма странная ошибка.
>Что пишет cat /etc/protocols | grep -i udp ?
Да, и права на него проверьте
>>Весьма странная ошибка.
>>Что пишет cat /etc/protocols | grep -i udp ?
>
>
>Да, и права на него проверьте
Да, вот с правами помоему засада. Кажись дело все в них. Будем думать. Спасибо!!!
>Весьма странная ошибка.
>Что пишет cat /etc/protocols | grep -i udp ?>cat /etc/protocols | grep -i udp
udp 17 UDP # user datagram protocol
>>Весьма странная ошибка.
>>Что пишет cat /etc/protocols | grep -i udp ?
>
>>cat /etc/protocols | grep -i udp
>udp
> 17 UDP
> # user
>datagram protocol
короче смотрим:
INET.pm
ищем: Bad protocol
видим после:
if(@proto = getprotobyname($proto)) {
$proto = $proto[2] || undef;
}
else {
$@ = "Bad protocol '$proto'";
return;
}тестируем: getprotobyname с разными параметрами, может у тебя udp вообще нет?
тестируем на перле и на си. библиотека libc ее перл динамически подгружает.
а дальше к ядру :)
>тестируем: getprotobyname с разными параметрами, может у тебя udp вообще нет?getprotobyname всего-лишь смотрит в /etc/protocols
>
>>тестируем: getprotobyname с разными параметрами, может у тебя udp вообще нет?
>
>getprotobyname всего-лишь смотрит в /etc/protocolsСПАСИБО ВСЕМ. ВЕ ДЕЛО БЫЛО В ПРАВАХ. ТЕПЕРЬ РАБОТАЕТ
>>
>>>тестируем: getprotobyname с разными параметрами, может у тебя udp вообще нет?
>>
>>getprotobyname всего-лишь смотрит в /etc/protocols
>
>СПАСИБО ВСЕМ. ВЕ ДЕЛО БЫЛО В ПРАВАХ. ТЕПЕРЬ РАБОТАЕТ
:-)