2012-06-25 2 views
3

TcpClient가 네트워크 응용 프로그램에서 소켓 작업을 단순화한다는 인상하에있었습니다.데이터 읽기 TcpClient가 소켓보다 열등하다

그러나 TcpClient는 기본 소켓에서 읽어야하는 데이터의 양을 알아야합니다. TcpClient.GetStream (..)처럼 보입니다 .Read (..)는 지정된 바이트 수를 읽는 Socket.Receive (..)를 호출합니다.

TcpClient는 NetworkStream을 노출하므로 처리하기가 매우 어려울 수 있습니다. 종료 문자열과 신뢰할 수없는 DataAvailable 속성과 같은 항목은 알 수없는 TCP "패킷"을 읽는 것을 복잡하게 만듭니다.

Socket.ReceiveFrom (..)을 사용하면 훨씬 더 "패킷"지향적 인 것처럼 보입니다.

나는 보통 핸드 셰이크 등을 결합하고하여 TcpClient를 사용하여 읽기 나는

 Socket socket = _tcpClient.Client; 

     byte[] buffer = new byte[1000]; 

     IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); 
     EndPoint senderRemote = sender; 

     int length = socket.ReceiveFrom(buffer, ref senderRemote); 

     string replyString = Encoding.ASCII.GetString(buffer, 0, length); 

     return replyString; 

버퍼 초기화 일부 오버 헤드를 사용하지만, 그것은는 NetworkStream에서 한 번에 한 바이트를 읽기, 찾고 친다 종료 문자 또는 문자열.

TcpClient가 더 나은 방법으로 데이터 읽기를 처리하지 않는다는 것이 약간 이상하지 않습니까? 즉 소켓이하는 방식입니까?

답변

1

페이로드의 크기를 포함하는 고정 된 크기의 헤더가있는 프로토콜이 있으므로 이 아닌 이상한 패킷 일 수 있습니다.

경우에 따라 Socket을 직접 사용하는 것이 더 좋을 수도 있고, 버퍼로 읽는 NetworkStream 주위에 래퍼를 작성하여 종료 문자로 Peek() 수 있습니다.