2012-03-02 4 views
1

Эта проблема действительно загадочное для меня: я следующий скрипт работает на сервере VMWare 2.0:Перл работает в VMWare сервере, но не в VMWare ESXi

#!/usr/local/bin/perl 
# server (transmitter) 
use strict; 
use IO::Socket::Multicast6; 
use IO::Interface; 
use constant GROUP => "235.1.1.2"; 
use constant PORT => "3000"; 
my $sock = IO::Socket::Multicast6->new(
        Proto=>"udp", 
        Domain=>AF_INET, 
        PeerAddr=>GROUP, 
        PeerPort=>PORT); 
$sock->mcast_if("eth1"); 
$sock->mcast_ttl(10); 
while (1) { 
    my $message = localtime(); 
    $sock->send($message) || die "Could not send: $!"; 
} continue { 
    sleep 4; 
} 

Он отлично работает на VMWare сервере. Я клонировать эту виртуальную машину на сервере Exsi но работает точно такую ​​же копию виртуальной машины, запустив сценарий, и я получаю следующее сообщение об ошибке:

Невозможно вызвать метод «mcast_if» на неопределенное значение

Im действительно озадачен этим, так как я не уверен, в чем проблема. нет ничего другого, кроме процессора, работающего на обеих машинах, но я не вижу, как что-то такое низкое значение может вызвать проблему, но я могу ошибаться. perl -d не очень помог. Спасибо.

ответ

3

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

my $sock = IO::Socket::Multicast6->new(
    Proto=>"udp", 
    Domain=>AF_INET, 
    PeerAddr=>GROUP, 
    PeerPort=>PORT) 
    or die "Socket failed: $!"; 
+1

Да, это полностью помогло, и я немного смущен. У этих виртуальных пар есть сценарий, который сбрасывает маршруты, чтобы не включать в себя GW по умолчанию, поскольку это среда, содержащаяся в ней. Поскольку у этой виртуальной машины нет маршрута для mcast-трафика, он не может создать сокет. Спасибо за быстрый ответ. – salparadise

0

Конструктор new() не работает, но не создает исключение. Я не знаю его API: есть ли способ заставить его рассказать вам, почему?

В противном случае вы можете попробовать errno (то есть, $!).

Смежные вопросы