1

我正在努力让 Multicast 在 OSX 主机和 Win7 来宾的虚拟机下工作。我的多播代码通常在 Windows7 机器的真实网络上运行良好,但我需要能够远离它进行开发。

我读到 VB 可能正在创建其他接口,其中一个接口正在获取无法重复的多播数据包,因此我编写了以下代码来尝试处理该问题,但在 InternalNetwork 或 HostOnly 下的 VB 中仍然失败。

我是否需要通过物理连接到网络(而不是 wifi)才能工作?还是我还在做其他错事?

编辑:稍微简化了我的代码,仍然不起作用。

NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();

// Get netowrk info
int defaultPort = 5050;
string localName = Dns.GetHostName();
IPHostEntry hostEntry = new IPHostEntry();
hostEntry = Dns.GetHostByName(localName);
IPAddress localAddress = hostEntry.AddressList[0];

// create a socket pair for every interafce
for(int i=0;i<nics.Length;i++)
{
    #region Make Outgoing Socket on Interface

    if (!nics[i].SupportsMulticast)
    {
        continue; // skip this one
    }
    Console.WriteLine("Adding socket to nic: " + nics[i].Name);
    // output interface
    Socket mcastSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

    // Bind the socket to default IP address and port.
    mcastSocket.Bind(new IPEndPoint(localAddress,4568+i));

    // Select Adapter for outgoing Multicast packets );
    int optionValue = (int)IPAddress.HostToNetworkOrder(i);

    // Multicast Address - To add membership : ");
    IPAddress mcastAddress = IPAddress.Parse("224.5.6.7");

    // Port number - Where Multicast members are listening : ");
    int mcastPort = 4567;
    MulticastOption mcastOpt = new MulticastOption(mcastAddress,localAddress);

    // Add membership to the group.
    mcastSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, mcastOpt);

    // Set the required interface for outgoing multicast packets.
    mcastSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, optionValue);

    mcastSocket.Connect(new IPEndPoint(mcastAddress,4567));

    // add to transmission list
    transmissionList.Add(mcastSocket);

    #endregion
}

#region Make Incoming Socket on Interface

// make socket to read for incoming multicast
Socket inSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
inSocket.Bind(new IPEndPoint(localAddress, 4567));
inSocket.SetSocketOption(SocketOptionLevel.IP,                SocketOptionName.AddMembership, new MulticastOption(multicastIpAddr));
receptionList.Add(inSocket);
4

1 回答 1

1

摘自上述博客

可能还有其他方法,并非所有这些步骤都可能真的是必要的,但这对我有用:

  1. 从 Oracle VM VirtualBox 下载并安装最新的 VirtualBox 还下载并安装 Oracle VirtualBox Extension Pack(可能不是必需的,但我这样做了。)

  2. 将 Win7 的副本安装到 VirtualBox VM 中。

  3. 克隆 VM 以创建第二台计算机。极其重要:克隆以与其父级相同的 MAC 地址开始。这让我困扰了很长时间。进入克隆的网络设置->高级,并通过按 MAC 旁边的圆形箭头请求它为您分配一个新的 MAC。(这仅在虚拟机关闭时有效。)

  4. 将两台机器的网络类型设置为“内部网络”。(请注意,这会将它们与您的主机和互联网隔离开来。)

  5. 在主机的命令行上,启用 dhcp(这也可能不是绝对必要的,但我就是这样做的。作为替代方案,您也可以手动为两台机器配置 IP)。假设您使用默认的内部网络名称“intnet”,您可以这样做(全部在一行上):
    dhcpserver add --netname intnet --ip 10.10.10.1 --netmask 255.255.255.0 --enable --lowerip 10.10.10.10 --upperip 10.10.10.128

非常重要: 在 VirtualBox 创建的环境中,有多个声称支持多播的 NIC。然而,他们在撒谎。此外,由于 VirtualBox 分配指标的方式,您的传出套接字将被分配给一个骗子,他会很高兴地吞噬您的多播消息而不发送它们。解决方案是专门在每个声称具有多播功能的 NIC 上打开一个传出套接字,并将传出数据包发送给所有这些 NIC。下面是我打开套接字并列出列表的代码。发送数据包时只需在列表中进行foreach。

NetworkInterface[] nics =   
                  NetworkInterface.GetAllNetworkInterfaces();
  // Get netowrk info
  int defaultPort = 5050;
  string localName = Dns.GetHostName();

  IPHostEntry hostEntry = new IPHostEntry();
  hostEntry = Dns.GetHostByName(localName);
  IPAddress localAddress = hostEntry.AddressList[0];
   for(int i=0;i<nics.Length;i++){
            if (!nics[i].SupportsMulticast)
            {
                continue; // skip this one
            }
            Console.WriteLine("Adding socket to nic: " + nics[i].Name);
            // output interface
            Socket mcastSocket = new 
                Socket(AddressFamily.InterNetwork, 
                     SocketType.Dgram, ProtocolType.Udp);

            // Bind the socket to default IP address and port.
            mcastSocket.Bind(new IPEndPoint(localAddress,4568+i));

            //Select Adapter for outgoing Multicast packets );

            int optionValue = (int)IPAddress.HostToNetworkOrder(i);

            //Multicast Address - To add membership : 
            IPAddress mcastAddress = IPAddress.Parse("224.5.6.7");

            // Port number - Where Multicast members are listening 
            int mcastPort = 4567;
            MulticastOption mcastOpt = new
                MulticastOption(mcastAddress,localAddress);

             // Add membership to the group.
            mcastSocket.SetSocketOption(SocketOptionLevel.IP, 
                SocketOptionName.AddMembership, mcastOpt);

            // Set the required interface for outgoing multicast packets.
            mcastSocket.SetSocketOption(SocketOptionLevel.IP, 
                SocketOptionName.MulticastInterface, optionValue);

            mcastSocket.Connect(new 
                IPEndPoint(mcastAddress,4567));

            // add to transmission list
            transmissionList.Add(mcastSocket);
        }
于 2014-04-24T22:10:55.393 回答