OSXホストとWin7ゲストを備えた仮想ボックスでマルチキャストを機能させようとして、髪の毛を引き裂いています。私のマルチキャスト コードは、通常、Windows 7 マシンの実際のネットワークでは問題なく動作しますが、それ以外で開発できるようにする必要があります。
VB が追加のインターフェイスを作成していて、そのうちの 1 つがそれを繰り返すことができないマルチキャスト パケットを取得している可能性があることを読んだので、それを処理するために以下のコードを書きましたが、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);