从C#中的套接字读取
时间:2020-03-05 18:48:43 来源:igfitidea点击:
我正在尝试从tcp打开的流套接字读取ASCII文本响应
到目前为止,这是我想出的。我想知道包括错误处理在内的最佳方法是什么。在do循环中的Receive调用之后,我还应该检查SocketError吗?
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(); } }
解决方案
回答
最好的选择可能是TcpClient。在.NET文档中,有一个很好的示例可以准确地完成我们正在做的事情:
http://msdn.microsoft.com/zh-CN/library/system.net.sockets.tcpclient.aspx
祝你好运!