1

我正在研究 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)

谢谢尼克朗

4

2 回答 2

1

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

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

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

这里有很多关于在 C# 中使用多播的更多信息。

于 2012-02-23T22:44:23.200 回答
0

我有类似的问题,我在这里看到的所有代码似乎都没有工作。当我启动我的程序时,会弹出这个防火墙窗口,告诉你防火墙已经阻止了一些功能。

我的问题是我点击了允许访问而没有勾选“私人网络,就像我的家庭或工作网络一样糟糕”的复选框。您当然可以稍后在防火墙设置中更改此设置并勾选该复选框。de 服务器和另一台机器都必须选中该复选框。或者至少这就是我的工作的原因。

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

于 2015-04-14T04:47:04.770 回答