【问题标题】:C# Getting sender address from UDP messageC#从UDP消息中获取发件人地址
【发布时间】:2019-02-03 13:37:29
【问题描述】:

我有一个嵌入式以太网接口 (Lantronix XPort),它使用其识别信息响应 UDP 广播。

我能够多播“魔术包”并且侦听器正确接收数据报,但是我还需要找出发送该响应数据报的 IP 地址。如果是 TCP,我会使用 socket.RemoteEndPoint,但是当应用于 UDP 套接字时会引发异常。

public class Program
{
    public static void Main(string[] args)
    {
        // magic packet
        byte[] magicPacket = new byte[4] { 0, 0, 0, 0xf6 };

        // set up listener for response
        Socket sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        // EDIT: Also, had to add this to for it to broadcast correctly
        sendSocket.EnableBroadcast = true;
        IPEndPoint listen_ep = new IPEndPoint(IPAddress.Any, 0);
        sendSocket.Bind(listen_ep);

        // set up broadcast message
        EndPoint send_ep = new IPEndPoint(IPAddress.Parse("192.168.255.255"), 30718);
        sendSocket.SendTo(magicPacket, magicPacket.Length, SocketFlags.None, send_ep);

        DateTime dtStart = DateTime.Now;
        while (true)
        {
            if (sendSocket.Available > 0)
            {
                byte[] data = new byte[2048];
                // throws SocketException
                //IPEndPoint ip = sendSocket.RemoteEndPoint as IPEndPoint;
                sendSocket.Receive(data, SocketFlags.None);
                if (data.Length > 4)
                {
                    PrintDevice(data);
                }
            }

            if (DateTime.Now > dtStart.AddSeconds(5))
            {
                break;
            }

            Console.WriteLine(".");

            Thread.Sleep(100);
        }

        // wait for keypress to quit
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
} 

有什么想法吗?是否有更好的策略来读取可以让我确定远程 IP 地址的响应数据报?

编辑:

通常情况下,我在 SO 上发布的那一刻,我就会有一个清晰的时刻。

原来我可以这样做:

                EndPoint remote_ep = new IPEndPoint(IPAddress.Any, 0);
                // Use ReceiveFrom instead of Receieve
                //sendSocket.Receive(data, SocketFlags.None);
                sendSocket.ReceiveFrom(data, ref remote_ep);

并且 remote_ep 现在包含远程端点信息!

【问题讨论】:

    标签: c# sockets udp


    【解决方案1】:

    查看ReceiveFrom 而不是 Receive,它会让您传入对 Endpoint 的引用。

    【讨论】:

    • 我刚刚找到了!谢谢,我会在 8 分钟内接受。 :)
    【解决方案2】:

    异步套接字呢?我没有找到任何方法来获取远程 IP 地址。 (异步方法ReceiveFromAsync是我在wp8中唯一的选择)

    【讨论】:

      【解决方案3】:

      EndPoint remote_ep = new IPEndPoint(IPAddress.Any, 0); // 使用 ReceiveFrom 代替 sendSocket.Receive(数据, SocketFlags.None);
      sendSocket.ReceiveFrom(data, ref remote_ep);

      我认为它适用于 IP,但它对于端口号失败 如果你注意到

      尝试将 0 更改为 6530 4expl 之类的其他内容

      系统会生成它的随机端口号

      有什么想法吗?

      附:有什么想法可以在这里更改我的用户名....?

      找到它:抽象类仅用于表示端口它的值而不是值

      因为事先没有完成绑定,所以这个操作 ref EndPoint 需要代表发送者。这意味着它在那里显示发件人端口和 IP,而不是指定从何处获取通信。 EndPoint 实例化实际上只是一种形式,似乎它被系统用发件人地址覆盖。我认为它必须与 UDP 协议的工作方式有关。 但总而言之,ref EndPoint 只显示你从哪里得到数据包,只是它没有指定你希望你的 commuicatino 来自哪里。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-23
        • 2013-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多