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

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

  •  1
  • rrhartjr  · 技术社区  · 14 年前

    我有一个嵌入式以太网接口(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地址?

    编辑:

    正如典型的那样,当我发帖的时候,一个清晰的瞬间就打动了我。

    结果证明我可以这样做:

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

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

    3 回复  |  直到 11 年前
        1
  •  8
  •   Brad Nabholz    14 年前

    看一看 ReceiveFrom 它将允许您传入对端点的引用,而不是接收。

        2
  •  0
  •   Thomas    14 年前

    endpoint remote_ep=new ipendpoint(ipaddress.any,0);//使用receiveFrom而不是 sendsocket.receive(数据,socketflags.none);
    sendsocket.receiveFrom(数据,参考远程访问);

    我认为它对IP有效,但对端口号无效 如果你注意到

    试着查一些其他的东西,比如65304expl

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

    你知道为什么吗?

    P.S.我能在这里更改我的用户名吗??

    找到它:抽象类只需要表示它在值中而不是在值中的端口。

    因为在处理之前没有完成绑定,所以这个操作引用端点需要表示发送者。这意味着要显示发送方端口和IP,而不是指定从何处获取通信。端点实例化实际上只是一种形式,看起来它被系统覆盖,不管怎样都有发送者地址。我认为这与UDP协议的工作方式有关。 但是,所有的引用端点都只显示您从何处获取数据包,并且没有指定您希望U'R commuicatino从何处获取数据包。

        3
  •  0
  •   harsini    11 年前

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