我拼命想让多播在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);
节选自上述博客
可能有其他的方法,并不是所有这些步骤都是必要的,但这是对我有效的:
-
从Oracle VM下载并安装最新的VirtualBox VirtualBox还下载并安装Oracle VirtualBox扩展包(可能不是必需的,但我做了)
-
在VirtualBox虚拟机中安装Win7拷贝
-
克隆虚拟机以创建第二台机器。至关重要的是:克隆的MAC地址与其父地址相同。这件事困扰了我很长时间。进入网络设置->克隆的高级,并通过按MAC旁边的圆形箭头请求它分配给你一个新的MAC(这只在虚拟机关机时有效)
-
将两台机器的网络类型设置为"内部网络"。(注意,这将把它们与你的主机和互联网隔离。)
-
在您的主机的命令行上,启用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);
}