繁体   English   中英

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

[英]unable to send data using udp in c#

您好,我正在开发示例应用程序,以演示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时,我都会得到黑屏,并且什么都不会发生。 有人可以告诉我如何解决此问题吗? 任何帮助,将不胜感激。 谢谢。

这里有几个问题:

  1. 您可以在该端口上启动侦听器之前 (通过senddata() )将数据发送到udp端口,并且只执行一次,因此侦听器没有机会接收到它。

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

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

  4. UdpClient实现IDisposable ,因此请在完成UdpClient其处置。

  5. 您的while (true)循环将不起作用,因为您没有处理UdpClient ,因此在循环的第二次迭代中,第二个UdpClient将尝试绑定到相同的9999端口并失败,因为已经有侦听器了(您没有t处置)在同一端口上。

您的代码上面有修复程序(显然,这不是“生产”代码,因此我不会添加取消之类的内容,仅是能够看到消息的修复程序):

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
    }
}

您似乎没有输出接收到的字符串。

像这样...

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

尝试更改以下内容:

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

使用端口9999而不是随机端口。 老实说,我对此并不感到意外,对此感到有些惊讶。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM