title: Simple UDP example to send and receive data from same socket
body: <p>For some reason I am having a hard time sending and receiving data from the same socket. Anyways here is my client code:</p>
  
  <pre><code>var client = new UdpClient();
  IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000); // endpoint where server is listening (testing localy)
  client.Connect(ep); 
  
  // send data
  client.Send(new byte[] { 1, 2, 3, 4, 5 }, 5);
  
  // then receive data
  var receivedData = client.Receive(ref ep);  // Exception: An existing connection was forcibly closed by the remote host
  </code></pre>
  
  <p><strong>Basically I want to create a protocol where I send a udp packet and then I expect a response. Just like the HTTP protocol for every request there is a response.</strong> This code works if the server is on a different computer. There might be the case where the server and client are on the same computer though.</p>
  
  <p>Here is the server:</p>
  
  <pre><code>UdpClient udpServer = new UdpClient(UDP_LISTEN_PORT);
  
  while (true)
  {
      var groupEP = new IPEndPoint(IPAddress.Any, 11000); // listen on any port
      var data = udpServer.Receive(ref groupEP);
      udpServer.Send(new byte[] { 1 }, 1); // if data is received reply letting the client know that we got his data          
  }
  </code></pre>
  
  <hr>
  
  <h2>Edit</h2>
  
  <p>the reason why I cannot use tcp is because sometimes the client is behind a NAT (router) and it is simpler to do UDP hole punching than TCP.</p>
  
  <hr>
  
  <h2>Solution:</h2>
  
  <p>thanks to markmnl answer here is my code:</p>
  
  <p>Server:</p>
  
  <pre><code>UdpClient udpServer = new UdpClient(11000);
  
  while (true)
  {
      var remoteEP = new IPEndPoint(IPAddress.Any, 11000); 
      var data = udpServer.Receive(ref remoteEP); // listen on port 11000
      Console.Write("receive data from " + remoteEP.ToString());
      udpServer.Send(new byte[] { 1 }, 1, remoteEP); // reply back
  }
  </code></pre>
  
  <p>Client code:</p>
  
  <pre><code>var client = new UdpClient();
  IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000); // endpoint where server is listening
  client.Connect(ep);
  
  // send data
  client.Send(new byte[] { 1, 2, 3, 4, 5 }, 5);
  
  // then receive data
  var receivedData = client.Receive(ref ep);
  
  Console.Write("receive data from " + ep.ToString());
  
  Console.Read();
  </code></pre>