如何在OSX上的VirtualBox Guest OS中获得多播工作



我拼命想让多播在OSX主机和Win7客户的虚拟盒子下工作。我的多播代码通常在Windows7机器的真实网络上工作得很好,但我需要能够远离它。

我读到,这是可能的,VB正在创建额外的接口,其中一个是得到我的多播数据包,不能重复它,所以我写了下面的代码来尝试处理,但它仍然失败在VB在InternalNetwork或HostOnly。

我需要通过物理连接到网络(不是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);

节选自上述博客

可能有其他的方法,并不是所有这些步骤都是必要的,但这是对我有效的:

  1. 从Oracle VM下载并安装最新的VirtualBox VirtualBox还下载并安装Oracle VirtualBox扩展包(可能不是必需的,但我做了)

  2. 在VirtualBox虚拟机中安装Win7拷贝

  3. 克隆虚拟机以创建第二台机器。至关重要的是:克隆的MAC地址与其父地址相同。这件事困扰了我很长时间。进入网络设置->克隆的高级,并通过按MAC旁边的圆形箭头请求它分配给你一个新的MAC(这只在虚拟机关机时有效)

  4. 将两台机器的网络类型设置为"内部网络"。(注意,这将把它们与你的主机和互联网隔离。)

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

至关重要:

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);
        }

最新更新