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(); } }
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!