代码之家  ›  专栏  ›  技术社区  ›  MatMat

Udp服务器接收来自外部客户端的消息,就像它来自服务器IP一样[duplicate]

  •  1
  • MatMat  · 技术社区  · 7 年前

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

    我能够多播“魔术包”,并且侦听器正确地接收到数据报,但是我还需要找出发送该响应数据报的IP地址。如果是TCP,我会使用套接字。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);
    

    远程ep现在包含远程端点信息!

    0 回复  |  直到 15 年前