Старый 25.05.2013, 16:47   #1
EndLessDre@m
 
Регистрация: 08.08.2010
Сообщений: 1
Репутация: 0
По умолчанию Perl, аналог tracerout, не могу прочитать icmp пакет

такой вот вопрос, все уже перегуглил, но так и не решил. На Линуксе все работает, пакеты отправляются и нормально считываются, но мне нужно, чтобы работало и на Винде.

Вот примерный код:

PHP код:
$udp = new IO::Socket::INET (
                            
LocalPort => 33435,
                            
Proto => 'udp',
                            
PeerAddr => $ip,
                            
PeerPort => 33435
                            
) or die "Cann't create socket: $!";
$icmp = new IO::Socket::INET (
                            
LocalPort => 33435,
                            
Proto => 'icmp'
                            
) or die "Cann't create socket: $!";

print 
$udp 'Echo';
$icmp->recv($datagram1500$flags); 
и на винде просто зависает и все.

Смотрел трафик WireShark'ом пакет отправляется, icmp пакет приходит, но скрипт не может прочитать... помогите пожалуйста.


и да, сторонние библиотеки не предлагать типа Ping Traceroute
EndLessDre@m вне форума   Ответить с цитированием
Старый 30.05.2013, 12:30   #2
halberd
 
Регистрация: 29.05.2013
Сообщений: 4
Репутация: 0
По умолчанию

Я никогда не делал такого в перле под виндой но мысли такие:
1)Перл тут использует raw сокет, поэтому запускать его надо из под админа(что ты скорее всего сделал, но всё-таки).
2)Проверить что фаер пропускает icmp(Тоже просто, тоже глупо, но проверить стоит)
3)udp насколько мне известно не получает icmp сообщения "Connection refused" постольку по скольку не имеет понятия соединения как в tcp, поэтому udp пинг стоит использовать если ты уверен что в момент когда ты посылаешь пакет сокет будет открыт, в основном это актуально для echo демонов, а это как известно inetd, которого на виндовых машинах не бывает, однако tcp пинг в перле использует POSIX вызов alarm() которого винда не имеет, а портировать это вообще никто в перл не стал, поэтому либо тут наиболее универсальным будет использовать API биндинги Win32::API, либо использовать icmp пинги, проверив фаер и права.
4)Если бы у меня была такая проблема и постольку по скольку я не могу знать все тонкости портирования подобных механизмов в перле я бы использовал Win32::API и использовал IcmpSendEcho апиху как это делает утилита ping как проверенный способ который насколько я помню использует виндовый сервис вместо прямого создания raw сокета и посему не требует повышенных прав.
halberd вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot