我无法使UDP端口在Windows Azure虚拟机上运行

时间:2014-05-21 21:56:09

标签: sockets networking azure udp virtual-machine

我无法在Windows Azure虚拟机上收到UDP数据包。我做了以下事情:

  1. 在虚拟机上,通过Windows防火墙,我为UDP和TCP协议打开了端口1234 *入站和出站。我没有添加任何IP排除。该规则应适用于域,私人和公共配置文件。我允许Block Edge Traversal。

  2. 在Azure管理门户中,我为我的虚拟机实例添加了端点。我添加了UDP和TCP协议端点。公共和私人端口号都是1234。

  3. 我写了两个测试程序: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());
                }
            }
        }
    

1 个答案:

答案 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。在任何一种情况下,您都需要点击负载平衡端点,而不是来自互联网无法访问的内部端点。