2011-01-05 6 views
3

C#에서 TCPIP 소켓의 수신 버퍼 크기를 결정하는 방법이 있습니까? 서버에 메시지를 보내고 수신 버퍼 크기가 확실하지 않은 응답을 기다리고 있습니다.소켓 수신 버퍼 크기

  IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.125.125.226"),20060); 
      Socket server = new Socket(AddressFamily.InterNetwork, 
           SocketType.Stream, ProtocolType.Tcp); 
      server.Connect(ipep); 

      String OutStr= "49|50|48|48|224|48|129|1|0|0|128|0|0|0|0|0|4|0|0|32|49|50"; 

      byte[] temp = OutStr.Split('|').Select(s => byte.Parse(s)).ToArray(); 

      int byteCount = server.Send(temp); 

      byte[] bytes = new byte[255]; 
      int res=0; 
      res = server.Receive(bytes); 
      return Encoding.UTF8.GetString(bytes); 

답변

6

데이터를 수신하는 데 사용되는 버퍼의 크기는 응용 프로그램 또는 프로토콜에 따라 다릅니다. 수신 버퍼의 크기를 알려주는 언어는 없습니다. 또한 '이 메시지를 받기 위해 23867 바이트가 필요합니다.'라는 사용 가능한 소켓 함수가 없습니다. 일반적으로 응용 프로그램은 수신 버퍼가 어떤 크기 여야하며이 문제를 처리하는 방법을 프로토콜에서 해결해야합니다. 일반적으로 프로토콜은 다음 중 하나를 사용합니다.

  • 메시지의 바이트 수를 지정합니다.

이것의 결과는 응용 프로그램이 분할 메시지를 처리해야한다는 것입니다 (메시지의 끝을 나타 내기 위해 0x7E가를 사용하여 예를 들어, HDLC 용) 종료 문자를 지정합니다. 예를 들어 서버가 2000 바이트의 메시지를 보낼 수 있지만 수신 버퍼가 1000 바이트 만있는 경우 메시지를 완료했는지 또는 부분적으로 완료되었는지를 알려주는 코드를 작성해야합니다.

+0

종료 문자가 없으므로 수신 바이트가 끝날 때까지 루프를 돌리는 것과 같은 방법이 있습니다. – Kanishka

+0

@Kanishka는 일반적으로 최상의 성능을 위해 시스템 페이지 크기의 배수를 사용합니다. http://msdn.microsoft.com/en-us/library/ms724958(v=vs.85).aspx –

+1

@Kanishka : 여기보세요 http://msdn.microsoft.com/en-us/library /8s4y8aff.aspx. 'Remarks' 섹션에서 처리 대기중인 데이터가 더 있는지 결정하기 위해 Socket.Receive를 사용하는 방법에 대해 설명합니다. – sashang

4

TCP는 바이트 스트림입니다. 그것은 당신의 메시지 개념을 전혀 모릅니다.

해당 바이트 스트림 내에서 필요한 메시지 프레임 정보를 제공하는 것은 사용자의 몫입니다. 이를 수행하는 일반적인 방법은 메시지의 전체 길이를 포함하는 헤더를 접두어로 사용하거나 유효한 메시지에 달리 표시 할 수없는 문자로 메시지를 종료하는 것입니다.

여기서 TCP 메시지 프레임에 대해 이야기합니다 : http://www.serverframework.com/asynchronousevents/2010/10/message-framing-a-length-prefixed-packet-echo-server.html C++ 코드와 관련되어 있기 때문에 어떤 용도로 사용되지는 않습니다.

메시지 소비자가 길이가 접두어로 된 메시지를 처리하는 것이 일반적으로 약간 더 효과적이며 메시지 생성자가 문자로 구분 된 메시지를 생성하는 것이 종종 더 효과적입니다. 개인적으로 나는 가능한 한 항상 프리픽스가 붙은 메시지를 선호합니다.

메시지 앞에 길이가있는 x 바이트의 데이터를 보내면 피어는 길이를 알아 내기 위해 항상 x 바이트 이상을 읽어야한다는 것을 알게됩니다. 결과 메시지의 크기를 알고, 그 많은 바이트가있을 때까지 읽을 수 있습니다.

문자 구분 기호가있는 메시지를 사용하면 메시지 구분 기호를 찾을 때까지 읽은 모든 데이터를 읽고 계속 읽을 수 있습니다. 그런 다음 전체 메시지와 가능한 많은 데이터 (다음 메시지의 일부)가 버퍼에서 처리됩니다.