我无法在Windows Azure虚拟机上收到UDP数据包。我做了以下事情:
在虚拟机上,通过Windows防火墙,我为UDP和TCP协议打开了端口1234 *入站和出站。我没有添加任何IP排除。该规则应适用于域,私人和公共配置文件。我允许Block Edge Traversal。
在Azure管理门户中,我为我的虚拟机实例添加了端点。我添加了UDP和TCP协议端点。公共和私人端口号都是1234。
我写了两个测试程序:UDPSender和UDPReceiver。在我的本地网络上使用两台计算机,测试程序在它们之间成功发送了一个数据包。 (编辑:我还使用UDPTester Android App成功向运行UDPReceiver的PC发送“trans-ISP”消息。)
将UDPReceiver移动到我的虚拟机,我无法成功收到消息。
我的Azure端点配置中是否遗漏了任何内容?请帮助!
*
港口号改为保护无辜者。
以下测试程序代码......
UDPSender:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
textMessage.Text = "Knock, knock";
textIP.Text = "xxx.xxx.xxx.xxx";
textPort.Text = "1234";
}
private void buttonSend_Click(object sender, EventArgs e)
{
UdpClient udpClient = new UdpClient(textIP.Text, Convert.ToInt32(textPort.Text));
Byte[] sendBytes = Encoding.ASCII.GetBytes(textMessage.Text);
try
{
udpClient.Send(sendBytes, sendBytes.Length);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
UDPReceiver:
private static void Main(string[] args)
{
//Creates a UdpClient for reading incoming data.
UdpClient receivingUdpClient = new UdpClient(1234);
while (true)
{
//Creates an IPEndPoint to record the IP Address and port number of the sender.
// The IPEndPoint will allow you to read datagrams sent from any source.
System.Net.IPEndPoint RemoteIpEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Any, 0);
try
{
// Blocks until a message returns on this socket from a remote host.
Byte[] receiveBytes = receivingUdpClient.Receive(ref RemoteIpEndPoint);
string returnData = Encoding.ASCII.GetString(receiveBytes);
string messageOut = String.Format("[{0},{1}]@[{2}]: {3}",
RemoteIpEndPoint.Address.ToString(),
RemoteIpEndPoint.Port.ToString(),
DateTime.Now,
returnData.ToString());
Console.WriteLine(messageOut);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
答案 0 :(得分:0)
代码看起来正确。我把它与我的实施进行了比较。以下是关键部分供参考:
你的csdef应该有正确的端口协议。您说您是通过门户网站完成此操作,但确认已保存的设置:
<Endpoints>
<InputEndpoint name="UdpEndpoint" protocol="udp" port="8080" localPort="8080" />
</Endpoints>
(来自https://github.com/ytechie/LogHub/blob/master/Microsoft.LogHub.Cloud/ServiceDefinition.csdef)
听正确的端口就像:
var endPoint = new IPEndPoint(IPAddress.Any, 0);
var udp = new UdpClient(8080);
(来自https://github.com/ytechie/LogHub/blob/master/Microsoft.LogHub/Global.asax.cs)
随意查看我的实现并寻找差异。我注意到你正在使用&#34;接收&#34;的同步版本,但这不重要。
我也很好奇这是PaaS还是IaaS。在任何一种情况下,您都需要点击负载平衡端点,而不是来自互联网无法访问的内部端点。