c# - 来自现场设备的 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 端点?
解决方案
Azure 支持 UDP 公共终结点。只是想检查您使用的 UDP 有效负载的大小。如果 UDP 有效负载大于 1500 字节,则它将不起作用。
目前这是设计使然,因为我们目前在 vswitch 中不支持到公共 VIP 端点的片段。建议客户将 UDP 数据报保持在 1500 以下。短期内我们确实无法在不更改代码的情况下允许片段通过——NAT 基本上不支持它们
推荐阅读
- javascript - 使用 JS 进行 3D 渲染
- html - html引导程序中的按钮问题
- python - 不同设备连接到服务器时的套接字错误
- python - tkinter 代码给出“SyntaxError:注解的非法目标”
- angular - Angular 8 PWA 应用程序将 Server-Sent 事件永久置于挂起状态
- python - 将字符串拆分为长度连续增加的子字符串块
- wordpress - Wordpress 自定义模板不支持简码
- python - 使用 Selenium 获取 title= ' ' 中的信息
- python - 如何在 Python 中创建显式引用列表?
- intellij-idea - IntelliJ IDEA 中宏的位置