无法在c#中使用udp发送数据

时间:2017-12-21 07:38:08

标签: c# udp

您好我正在开发示例应用程序,用于演示udp客户端将数据从客户端发送到服务器。我已经创建了控制台应用程序,下面是我的代码。

class Program
    {
        static void Main(string[] args)
        {
            senddata();
            while (true)
            {
                try { 
                UdpClient udpClient = new UdpClient(9999);
                IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
                Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
                string returnData = Encoding.ASCII.GetString(receiveBytes);
                string result;
                result = returnData.ToString();
                }
                catch(Exception e)
                {

                }
            }
            void senddata()
            {
                UdpClient udpClient = new UdpClient(9999);

                udpClient.Connect("10.170.84.163", 9999);
                Byte[] senddata1 = Encoding.ASCII.GetBytes("Hello World");
                udpClient.Send(senddata1, senddata1.Length);

            }
        }
    }

每当Byte [] receiveBytes被执行时,我得到我的空白黑屏,什么都不会发生。谁能告诉我如何解决这个问题?任何帮助,将不胜感激。谢谢。

3 个答案:

答案 0 :(得分:3)

这里有几个问题:

  1. 您在启动该端口上的侦听器之前将数据发送到udp端口(通过senddata(),并且您只执行一次,因此听众无法收到它

  2. 发送数据时无需将UdpClient绑定到特定端口,尤其是在您使用其他UdpClient监听的同一端口上。只需使用UdpClient udpClient = new UdpClient();即可使用任何可用端口进行发送。

  3. 由于您正在测试 - 无需将数据发送到外部IP,而是发送到回送接口:udpClient.Connect(IPAddress.Loopback, 9999);

  4. UdpClient实施IDisposable,因此请在完成后将其丢弃。

  5. 您的while (true)循环不起作用,因为您没有处置UdpClient,所以在循环的第二次迭代中,第二次UdpClient将尝试绑定到同一循环9999端口并且失败,因为在同一端口上已经有监听器(你没有丢弃)。

  6. 您的代码上面有修复(显然不是“生产”代码,因此我不会添加取消等内容,只修复以便能够看到消息即将发布):

    static void senddata() {
        // send message every 100 ms
        while (true) {
            // wrap in using
            using (UdpClient udpClient = new UdpClient()) {
                // loopback
                udpClient.Connect(IPAddress.Loopback, 9999);
                Byte[] senddata1 = Encoding.ASCII.GetBytes("Hello World");
                udpClient.Send(senddata1, senddata1.Length);
            }
            Thread.Sleep(100);
        }
    }
    
    static void Main(string[] args) {
        // run sending in background
        Task.Run(() => senddata());
    
        try {
            // wrap in using
            using (UdpClient udpClient = new UdpClient(9999)) {
                IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
                // move while loop here
                while (true) {
                    // this blocks until message is received
                    Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
                    string returnData = Encoding.ASCII.GetString(receiveBytes);
                    Console.WriteLine(returnData);
                }
            }
        }
        catch (Exception e) {
            // do something meaningful
        }
    }
    

答案 1 :(得分:0)

看起来你没有输出收到的字符串。

像这样......

string result;
result = returnData.ToString();
Console.WriteLine(result);

答案 2 :(得分:0)

尝试更改以下内容:

IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);

使用端口9999而不是随机端口。我真的有点惊讶,不会抛出异常。

请注意,绑定到随机端口作为服务器不是非典型的,但远程端需要某种方式来发现随机端口I..E。 ftp使用第二个端口进行实际文件数据传输的方式,该端口号作为开始传输的消息的一部分发送。