How can I send data with a TcpListener, and wait for the response?

Kevin Doyon picture Kevin Doyon · Oct 23, 2009 · Viewed 11.1k times · Source

I have the following code:

using (TcpClient client = new TcpClient())
{
   client.Connect(host, port);

   using (SslStream stream = new SslStream(client.GetStream(), true))
   {
      stream.AuthenticateAsClient(host);

      stream.Write(System.Text.Encoding.ASCII.GetBytes(dataToSend));

      int byteRead = 0;
      byte[] buffer = new byte[1000];

      do
      {
         byteRead = stream.Read(buffer, 0, 1000);
         reponse += System.Text.Encoding.ASCII.GetString(buffer, 0, byteRead);
      }
      while (byteRead > 0);
   }
}

I send a string to a server, and then wait for the response.

Is this the proper way to do it?

If the server takes some time to process what I sent, will it still work or will stream.Read return 0 and exit the loop? Or if some packets from the response are lost and need to be resent, will it still work?

Answer

Brandon picture Brandon · Oct 23, 2009

The overall structure of your code looks right.

byteRead = stream.Read(buffer, 0, 1000); will block until all of the response data is retrieved from the server. If the remote server shuts down the connection (timeout, etc), 0 will be returned.

See the remarks found here.

The framework will properly deal with packets lost during network operations - don't worry about them.