【问题标题】:Send a UDP message to another network using socket使用套接字向另一个网络发送 UDP 消息
【发布时间】:2014-10-22 00:02:41
【问题描述】:

我一直在制作一个示例程序,其中用户可以使用 socketsUDP 连接来广播消息。它在 LAN 中成功,但我无法将我的消息广播到其他网络(例如 10.15.1.11 的消息到 10.11.1.23)。这是我的示例代码:

听众:

bworker = 作为 BackgroundWorker 的发送者;

        Socket _ListenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        IPEndPoint _ListenerEndPoint = new IPEndPoint(IPAddress.Any, _port);
        _ListenerSocket.EnableBroadcast = true;
        _ListenerSocket.Bind(_ListenerEndPoint);
        //_ListenerSocket.Connect(MulticastIP, _port);
        _ListenerSocket.Ttl = 255;
        _ListenerSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(MulticastIP));

        while (true)
        {
            byte[] msg = new byte[1024];
            _ListenerSocket.Receive(msg);
            string StringData = Encoding.Unicode.GetString(msg);
            bworker.ReportProgress(0, StringData);
        }

发件人:

Socket _ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            _ClientSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(MulticastIP));

        _ClientSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, int.Parse(ttl));

        IPEndPoint _ClientEndPoint = new IPEndPoint(MulticastIP, _port);

        _ClientSocket.Connect(_ClientEndPoint);

        byte[] MsgByte = new byte[1024];
        MsgByte = Encoding.Unicode.GetBytes(txtmsg.Text);
        _ClientSocket.Send(MsgByte);

变量:

public const int _port = 8041;        
public const string ttl = "255";
public IPAddress MulticastIP = IPAddress.Parse("239.0.0.222");

谢谢。

【问题讨论】:

  • 您和其他 LAN 之间的路由器可能拒绝转发具有多播目标 IP 的数据包。
  • 嗨,有没有办法检查我和其他局域网之间的路由器是否拒绝转发数据包?谢谢。
  • 最简单的方法是将数据包发送到单播目标(目标机器的实际IP地址),然后检查它是否到达。
  • 我想 ping 目的地是一种方法。目的地可以接收数据包。但它仍然无法接收我的消息。
  • 您可以简单地尝试将 IPEndPoint 中的 ip 更改为目标的 IP。 Ping 使用完全不同的消息,因此它不会告诉您问题是否与多播目标有关。

标签: c# sockets networking udp send


【解决方案1】:

您和另一个 LAN 之间的路由器可能拒绝转发具有多播目标 IP 的数据包。为了正确处理多播,路由器本身必须能够感知多播并实现诸如PIM(用于协调路由器之间的多播)和IGMP(用于与终端主机协调多播)等协议

【讨论】:

  • 即使你和另一个 LAN 之间的路由器拒绝转发数据包,我还能 ping 目标吗?谢谢
  • 它可能拒绝将数据包转发到 MULTICAST IP 地址。常规(单播)IP 地址应该可以正常工作,因此 ping 应该可以正常工作。
  • 我刚刚尝试了单播,但目的地仍然无法接收消息,但 ping 可以。
【解决方案2】:

您的路由器可能不转发多播包。为了使多播工作,通信路径上的所有路由器都必须启用多播。 Ping 只需要路由器转发 ping 包,因此它只会告诉您是否可以到达另一台计算机。查看this 文章以了解有关 C# 中的多播的更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 2021-07-09
    • 2018-05-16
    • 2015-05-17
    相关资源
    最近更新 更多