title: Async socket client using TcpClient class C#
body: <p>I have implemented a socket client using TcpClient class. So I can send and receive data, everything works good. But I ask some of the guru's out there :) Is there something wrong with my implementation? maybe there is a better way of doing things. In particular, how do I handle disconnects? Is there some indicator (or maybe I can write one myself) that tells me that socket has disconnected?</p>
  
  <p>I also have looked into async await features of Socket class, but can't wrap my head around "SocketAsyncEventArgs", why is it there in the first place.
  Why cant i just: <em>await Client.SendAsync("data");</em> ?</p>
  
  <pre><code>public class Client
  {
      private TcpClient tcpClient;
  
      public void Initialize(string ip, int port)
      {
          try
          {
              tcpClient = new TcpClient(ip, port);
  
              if (tcpClient.Connected)
                  Console.WriteLine("Connected to: {0}:{1}", ip, port);
          }
          catch (Exception ex)
          {
              Console.WriteLine(ex.Message);
              Initialize(ip, port);
          }
      }
  
      public void BeginRead()
      {
          var buffer = new byte[4096];
          var ns = tcpClient.GetStream();
          ns.BeginRead(buffer, 0, buffer.Length, EndRead, buffer);
      }
  
      public void EndRead(IAsyncResult result)
      {
          var buffer = (byte[])result.AsyncState;
          var ns = tcpClient.GetStream();
          var bytesAvailable = ns.EndRead(result);
  
          Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, bytesAvailable));
          BeginRead();
      }
  
      public void BeginSend(string xml)
      {
          var bytes = Encoding.ASCII.GetBytes(xml);
          var ns = tcpClient.GetStream();
          ns.BeginWrite(bytes, 0, bytes.Length, EndSend, bytes);
      }
  
      public void EndSend(IAsyncResult result)
      {
          var bytes = (byte[])result.AsyncState;
          Console.WriteLine("Sent  {0} bytes to server.", bytes.Length);
          Console.WriteLine("Sent: {0}", Encoding.ASCII.GetString(bytes));
      }
  }
  </code></pre>
  
  <p>And the usage:</p>
  
  <pre><code>static void Main(string[] args)
  {
      var client = new Client();
      client.Initialize("127.0.0.1", 8778);
  
      client.BeginRead();
      client.BeginSend("&lt;Names&gt;&lt;Name&gt;John&lt;/Name&gt;&lt;/Names&gt;");
  
      Console.ReadLine();
  }
  </code></pre>