UDP广播系统不会在不同的计算机上通信

时间:2012-02-23 22:37:12

标签: c# network-programming udp broadcasting

我正在研究C#中的广播信标,它应该向所有监听设备广播服务器信息。发送的信息将包含诸如WCF服务的URL,命名空间,所需参数列表等信息。我现在拥有的是发送者和接收者,当他们在同一台计算机上时可以完全正常。但是,一旦我将发送者放在另一台计算机而不是我的接收器上,发送者就会发送消息,但我的接收者永远不会得到它。不会抛出任何异常,并且两台计算机上都禁用了防火墙。

http://codeidol.com/csharp/csharp-network/IP-Multicasting/What-Is-Broadcasting/是我从中获取代码的地方。

发信人:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace UDPTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
            ProtocolType.Udp);
            sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
            IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, 9050);
            byte[] data = Encoding.ASCII.GetBytes("This is a test message");
            sock.SendTo(data, iep);
            sock.Close();
        }
    }
}

接收器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace UDPBroadcastReciever
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket sock = new Socket(AddressFamily.InterNetwork,
            SocketType.Dgram, ProtocolType.Udp);
            IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);
            sock.Bind(iep);
            EndPoint ep = (EndPoint)iep;
            Console.WriteLine("Ready to recieve");
            byte[] data = new byte[1024];
            int recv = sock.ReceiveFrom(data, ref ep);
            string stringData = Encoding.ASCII.GetString(data, 0, recv);
            Console.WriteLine("Received: {0} from: {1}", stringData, ep.ToString());
            sock.Close();
            Console.ReadLine();
        }
    }
}

有没有人知道我遗失的任何东西会让这两个人在两台不同的电脑上交谈?它们位于同一子网(192.168.1.x)

由于 Nick Long

2 个答案:

答案 0 :(得分:1)

使用多播而不是广播可能会更好;广播数据包通常会被路由器立即丢弃。选择239.0.0.0/24块中某处的IP地址作为多播地址;这是为组织本地消息保留的,所以只需在空中挑选一个号码并坚持下去。

您需要让您的发件人将其数据包发送到此地址,并让您的接收者加入多播组以接收它们。要加入多播组,请在套接字上调用它:

sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership,
    new MulticastOption(theMulticastIp));

有关在C#here中使用多播的更多信息。

答案 1 :(得分:0)

我遇到了类似的问题,在我看到的所有代码中似乎没有任何效果。 当我启动我的程序时,会弹出这个防火墙窗口,告诉你防火墙阻止了某些功能。

我的问题是我点击允许访问而没有勾选“私人网络,吸吮我的家或工作网络”的复选框。您可以在防火墙设置中稍后更改此选项并勾选该复选框。服务器和其他计算机都必须选中该复选框。或者至少那是我的矿井工作的原因。

此外,我必须将我的广播IP地址更改为例如192.168.1.255。我的路由器确实阻止了我的书224.0.0.0 - 239.255.255.255;

的推荐