2008-09-06 4 views
2

Ich versuche, ASCII-Text Antwort von einer tcp open-Streaming-Buchseaus einer Steckdose in C# Lesen

Das ist, was ich kam mit so weit zu lesen. Ich möchte wissen, was der beste Weg ist, dies zu tun, einschließlich der Fehlerbehandlung. Sollte ich auch den SocketError nach dem Receive-Aufruf in der do-Schleife überprüfen?

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

Antwort