C#从UDP消息中获取发件人地址

标签 c# sockets udp

我有一个嵌入式以太网接口(interface) (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 现在包含远程端点信息!

最佳答案

看看ReceiveFrom而不是 Receive,它将让您传递对 Endpoint 的引用。

关于C#从UDP消息中获取发件人地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3609689/

相关文章:

python - SocketServer Python

java - 来自 Linux-Java 线程转储的套接字信息

c# - 如何使用 NAUDIO 进行 VoIP

c# - 使用UDP接收和处理连续数据包

c# - 如果 udp 客户端收到 datagam,我们可以信任数据完整性吗?

c - Windows 7 中的 UDP 广播 - 它有效吗?

c# - 在asp.net命令字段中添加onclick事件

c# - RichTextBox 和特殊字符 c#

c# - StatusStrip - 添加一个右侧没有下拉箭头的按钮

c# - Xamarin Studios/C# 应用程序中的 clrzmq 找不到 libzmq