关于组播Multicast得奇怪问题!!!
本人想做一个象飞鸽一样的东西:能看见局域网内使用本程序的客户.想使用组播,但发现一个特别奇怪的现象:两台机器A(server 2003),B(xp),都运行程序,结果B能给A发,A不能给B发.即是B往组中写入数据,A,B均能读出.但A往组中写入数据,B却不能读出.
更让我疑惑的是A的IPAddressList有3项172.21.37.21,192.168.115.1,
192.168.0.1,B的IPAddressList只有一项172.21.37.98.
测试程序中发现,A居然使用第二个IP 192.168.115.1往组播写,B使用它唯一的IP!
还有就是,A上的组播地址只能为224.0.0.1,否则收不到任何数据!
B机器一切正常!
测试程序如下:
using System;
using System.Drawing;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;
public class MulticastChat : Form
{
TextBox newText;
ListBox results;
Socket sock;
Thread receiver;
IPEndPoint multiep = new IPEndPoint(IPAddress.Parse( "224.0.0.1 "), 9050);
public MulticastChat()
{
Text = "Multicast Chat Program ";
Size = new Size(400, 380);
Label label1 = new Label();
label1.Parent = this;
label1.Text = "Enter text string: ";
label1.AutoSize = true;
label1.Location = new Point(10, 30);
newText = new TextBox();
newText.Parent = this;
newText.Size = new Size(200, 2 * Font.Height);
newText.Location = new Point(10, 55);
results = new ListBox();
results.Parent = this;
results.Location = new Point(10, 85);
results.Size = new Size(360, 18 * Font.Height);
Button sendit = new Button();
sendit.Parent = this;
sendit.Text = "Send ";
sendit.Location = new Point(220,52);
sendit.Size = new Size(5 * Font.Height, 2 * Font.Height);
sendit.Click += new EventHandler(ButtonSendOnClick);
Button closeit = new Button();
closeit.Parent = this;
closeit.Text = "Close ";
closeit.Location = new Point(290, 52);
closeit.Size = new Size(5 * Font.Height, 2 * Font.Height);
closeit.Click += new EventHandler(ButtonCloseOnClick);
sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);
sock.Bind(iep);
sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,
new MulticastOption(IPAddress.Parse( "224.0.0.1 ")));
sock.SetSocketOption(SocketOptionLevel.IP,SocketOptionName.MulticastTimeToLive,6);
receiver = new Thread(new ThreadStart(packetReceive));
receiver.IsBackground = true;
receiver.Start();
}
void ButtonSendOnClick(object obj, EventArgs ea)
{
byte[] message = Encoding.ASCII.GetBytes(newText.Text);
newText.Clear();
sock.SendTo(message, SocketFlags.None, multiep);