【问题标题】:UDP broadcasting system won't communicate on separate computersUDP 广播系统不会在不同的计算机上通信
【发布时间】:2012-02-23 22:37:11
【问题描述】:

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

谢谢 尼克·朗

【问题讨论】:

  • 相信不是每个路由器都会转发广播包。也许您可以使用其他已知可以工作的应用程序来检查这一点。
  • 您对示例程序有什么建议吗?
  • 同时检查 C:\Windows\System32\LogFiles\Firewall 并查看网络设置的配置文件是否阻止了您正在广播的端口
  • @nick 可能是因为您在代码中广播到 255.255.255.255 (IPAddress.Broadcast),而该页面上的代码正在广播到 192.168.1.255。
  • @nick 不会发生。多播和广播数据包不会离开您的内部网络(如果这样做,它们会在到达您的 ISP 路由器的那一刻停止)。您最好的选择可能是设置一个 HTTP 服务器,您的应用程序可以定期连接到该服务器以更新您需要的任何内容。当然,如果你这样做,无论如何你都会对该地址进行硬编码,所以可能没有意义。

标签: c# network-programming udp broadcasting


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-12
      • 1970-01-01
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      • 2019-06-09
      • 2012-10-29
      相关资源
      最近更新 更多