문제
TCP 개방형 스트리밍 소켓에서 ASCII 텍스트 응답을 읽으려고 합니다.
이것이 내가 지금까지 생각해 낸 것입니다.오류 처리를 포함하여 이를 수행하는 가장 좋은 방법이 무엇인지 알고 싶습니다.do 루프에서 수신 호출 후에 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/en-us/library/system.net.sockets.tcpclient.aspx
행운을 빕니다!
제휴하지 않습니다 StackOverflow