首页 > 解决方案 > 来自现场设备的 UDP 数据包不会通过 azure 基础架构提供给我的服务

问题描述

现场设备(Loxone 微型服务器)正在将 UDP 数据包中的测量值发送到 azure VM 的公共地址和我的本地计算机,两者都在端口 1234 上(为了完整性而更改)。在与现场设备位于同一网络的本地计算机上,我用 C# 实现了一个测试接收器,它可以正确获取数据包。在 azure VM 上已经运行的应用程序上,我添加了与本地计算机相同的接收器代码,但没有收到 UDP 数据包。我在天蓝色管理平台上已经做过的事情: - 在网络配置中允许传入端口 1234 - 关闭防火墙

为了进行测试,我尝试了以下操作: - 在 azure VM 中的应用程序上实现了一个 UDP 发送器,它通过广播 IP 发送到端口 1234 -> 这有效!- 向网络接口添加了一个数据包监视器 -> 在这里我看到了两个数据包,内部广播和现场设备

//Receiver-Code简化为相关部分

class Program{
    public static void Main(string[] args){
        program.Run();
    }

    public void Run(){
        var sync = new LoxoneSyncProcess();
        while(true){
            sync.readUDP();
            Thread.sleep(10000);
        }
    }
}


class LoxoneSyncProcess{
    public LoxoneSyncProcess(){
        private UDPSocket c = new UDPSocket();
        c.Client(1234);
    }

    public void readUDP(){
        String buffer = c.getDatBuf();
        Console.WriteLine(buffer);
        //process buffer
    }
}


public class UDPSocket{
    private Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    private const int bufSize = 8 * 1024;
    private State state = new State();
    private EndPoint epFrom = new IPEndPoint(IPAddress.Any, 0);
    private AsyncCallback recv = null;
    private String datBuf = "";

    public class State
    {
        public byte[] buffer = new byte[bufSize];
    }

    public String getDatBuf()
    {
        String temp = datBuf;
        datBuf = "";
        return temp;
    }

    public void Client(int port)
    {
        _socket.Bind(new IPEndPoint(IPAddress.Any, port));
        Receive();
    }

    private void Receive()
    {
        _socket.BeginReceiveFrom(state.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv = (ar) =>
        {
            State so = (State)ar.AsyncState;
            int bytes = _socket.EndReceiveFrom(ar, ref epFrom);
            _socket.BeginReceiveFrom(so.buffer, 0, bufSize, SocketFlags.None, ref epFrom, recv, so);
            datBuf += Encoding.ASCII.GetString(so.buffer, 0, bytes);
            //Console.WriteLine("RECV: {0}: {1}, {2}", epFrom.ToString(), bytes, Encoding.ASCII.GetString(so.buffer, 0, bytes));
        }, state);
    }
}

代码正在运行,我收到自发送的 UDP 数据包到广播 IP 上的端口 1234,但不是来自现场设备。是否需要像 NAT 配置这样的表?还是先发制人?azure 是否支持公共 UDP 端点?

标签: c#azurenetworkingudp

解决方案


Azure 支持 UDP 公共终结点。只是想检查您使用的 UDP 有效负载的大小。如果 UDP 有效负载大于 1500 字节,则它将不起作用。

目前这是设计使然,因为我们目前在 vswitch 中不支持到公共 VIP 端点的片段。建议客户将 UDP 数据报保持在 1500 以下。短期内我们确实无法在不更改代码的情况下允许片段通过——NAT 基本上不支持它们


推荐阅读