tags:

views:

2383

answers:

1

I am trying to read ASCII text response from a tcp open streaming socket

This is what I have come up with so far. I want to know what is the best way to do this that includes error handling. Should I also be checking the SocketError after the Receive call in the do loop?

IPEndPoint ep = new IPEndPoint(IPAddress.Parse("192.168.1.1"), 9000);
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.SendTimeout = 5000;
sock.ReceiveTimeout = 5000;
if (null != sock)
{
 try
 {
  sock.Connect(ep);
  if (sock.Connected)
  {

   // Blocks until send returns.
   int bytesSent = sock.Send(buffer);
   Console.WriteLine("Sent {0} bytes.", bytesSent);
   //get the first 4 bytes, should be the lenngth of the rest of the response.
   byte[] response = new byte[4];
   int bytesRec = sock.Receive(response);
   int totalBytesRec = 0;
   if (4 == bytesRec)
   {
    int len = BitConverter.ToInt32(response, 0);
    response = new byte[len];
    Console.WriteLine("Trying to get {0} bytes.", len);
    bytesRec = 0;

    do
    {
     bytesRec = sock.Receive(response);
     totalBytesRec += bytesRec;
     forecast += Encoding.ASCII.GetString(response, 0, bytesRec);
    } while (totalBytesRec < len && bytesRec > 0);

    if (totalBytesRec != len)
     throw new Exception("The total bytes recieved from manager did not equal the expected bytes");
   }
   else
    throw new Exception("Unable to get the response size from the manager");


   Console.WriteLine("Received {0} bytes.", totalBytesRec);
  }

 }
 catch (SocketException ex)
 {
  Console.WriteLine("{0} Error code: {1}.", ex.Message, ex.ErrorCode);
 }
 catch (Exception ex)
 {
  Console.WriteLine(ex.Message);
 }
 finally
 {
  sock.Shutdown(SocketShutdown.Both);
  sock.Close();
 }
}
+2  A: 

Your best bet is probably TcpClient. There's a great sample that does exactly what you're doing right in the .NET Documentation here:

http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.aspx

Good luck to you!

Andy S