2014-12-18 3 views
0

Я искал интернет в течение недели или двух, чтобы найти клиентскую программу UDP, которая может отправлять и получать в одно и то же время, но на эту тему нет ничего для C#. В последние несколько дней я попытался создать UDP-клиент с потоком, который получает.C# udp не может принять

Отправка UDP-пакетов отлично работает, но программа не может получить для отправленного мной сервера, я считаю, что сервер отправляет все пакеты в другой порт.

Как исправить эту программу?

Есть ли более простой способ программирования UDP, например StreamReader и StreamWriter для 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); 
    } 

ответ

1

Поскольку UDP является ориентированное на обработку сообщений, а не потоковый, есть на самом деле не практический способ использовать StreamReader и StreamWriter с UDP. Лучше всего придерживаться ориентированного на сообщения ввода-вывода, как в вашем примере.

Проблема в вашем коде заключается в том, что вы используете два разных экземпляра 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); 
} 
Смежные вопросы