C# UDP 无法接收

本文关键字:UDP | 更新日期: 2023-09-27 18:34:30

我已经在互联网上搜索了一两个星期,以找到一个可以同时发送和接收的UDP客户端程序,但是对于c#没有任何关于这个主题的内容。在过去的几天里,我尝试使用接收的线程创建一个UDP客户端。

发送UDP数据包效果很好,但程序无法接收我发送到的服务器,我相信服务器正在将所有数据包发送到不同的端口。

如何修复此程序?

有没有更简单的方法来做UDP编程,如StreamReader和StreamWriter for TCP?

    static void CONNECTudp()
    {
        Console.WriteLine("Host:");
        IPAddress ipAddress = Dns.Resolve(Console.ReadLine()).AddressList[0];
        Console.WriteLine("Port:");
        int Port = int.Parse(Console.ReadLine());
        IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, Port);
        Thread UDPthread = new Thread(() => CONNECTudpthread(ipEndPoint));
        UDPthread.Start();
        UdpClient udp = new UdpClient();
        do
        {
            Byte[] sendBytes = Encoding.ASCII.GetBytes(Console.ReadLine());
            udp.Send(sendBytes, sendBytes.Length, ipEndPoint);
        } while (true);
    }
    static void CONNECTudpthread(IPEndPoint ipEndPoint)
    {
        UdpClient udp = new UdpClient();
        do
        {
            try
            {
                Byte[] receiveBytes = udp.Receive(ref ipEndPoint);
                string returnData = Encoding.ASCII.GetString(receiveBytes);
                Console.WriteLine(returnData);
            }
            catch (Exception)
            {
            }
        } while (true);
    }

C# UDP 无法接收

由于UDP是面向消息的而不是面向流的,因此没有一种实用的方法可以将StreamReader和StreamWriter与UDP一起使用。最好像您的示例中那样坚持使用面向消息的 I/O。

代码中的问题是使用两个不同的UdpClient实例进行发送和接收。您不显示UDP服务器代码,所以我也不能保证这是正确的。但如果是这样,那么如果您将代码修复为更像以下内容的内容,它应该可以工作:

static void CONNECTudp()
{
    Console.WriteLine("Host:");
    IPAddress ipAddress = Dns.Resolve(Console.ReadLine()).AddressList[0];
    Console.WriteLine("Port:");
    int Port = int.Parse(Console.ReadLine());
    IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, Port);
    // Bind port immediately
    UdpClient udp = new UdpClient(0);
    // Pass UdpClient instance to the thread
    Thread UDPthread = new Thread(() => CONNECTudpthread(udp));
    UDPthread.Start();
    do
    {
        Byte[] sendBytes = Encoding.ASCII.GetBytes(Console.ReadLine());
        udp.Send(sendBytes, sendBytes.Length, ipEndPoint);
    } while (true);
}
static void CONNECTudpthread(UdpClient udp)
{
    do
    {
        try
        {
            // Though it's a "ref", the "remoteEP" argument is really just
            // for returning the address of the sender.
            IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 0);
            Byte[] receiveBytes = udp.Receive(ref ipEndPoint);
            string returnData = Encoding.ASCII.GetString(receiveBytes);
            Console.WriteLine(returnData);
        }
        catch (Exception)
        {
        }
    } while (true);
}
相关文章:
  • 没有找到相关文章