一个现场设备(Loxone小型服务器)正在UDP数据包中将测量值发送到azure VM的公共地址和我的本地计算机上,二者都在端口1234(已更改完整性)上。在与现场设备位于同一网络中的本地计算机上,我用C#实现了一个测试接收器,它可以正确获取数据包。 在azure VM上已经运行的应用程序上,我添加了与本地计算机相同的接收者代码,并且没有UDP数据包。 我已经在azure管理平台上执行的操作: -在网络配置中允许传入端口1234 -关闭防火墙
对于测试,我尝试了以下操作: -在azure VM中的应用程序上实现了UDP发送器,该发送器通过广播IP发送到端口1234->可以使用! -在网络接口上添加了一个数据包监视器->在这里,我看到了两个包,内部广播和现场设备
//接收器代码简化为相关部分
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);
}
}
该代码正常工作,我接收到广播IP上的自发UDP数据包到端口1234,但不是从现场设备收到。 是否需要任何类似NAT配置的表?还是portforwarding? Azure是否支持公共UDP端点?
答案 0 :(得分:0)
Azure支持UDP公共端点。只是想检查您使用的UDP负载的大小。如果UDP有效负载大于1500字节,则它将不起作用。
这是设计使然,因为我们现在不支持vswitch中的公共VIP端点的片段。建议客户将UDP数据报保持在1500以下。在没有代码更改的情况下,我们短期内做不了任何事情都不允许片段通过-NAT基本上不支持它们。