2011-08-04 3 views
1

TCP 소켓에서 데이터를 가져 오는 Linux에서 인터페이스를 작성하고 있습니다. 사용자는 수신 된 데이터가 저장된 버퍼를 제공합니다. 제공된 버퍼가 작 으면 오류 만 반환하려고합니다. 첫 번째 문제는 버퍼가 작을지를 결정하는 것입니다. recv() 함수는 버퍼에 실제로 기록 된 바이트 양을 반환합니다. recv() 맨 페이지에 명시된 MSG_TRUNC 플래그를 사용하면 여전히 동일한 결과를 반환합니다. 두 번째 문제는 여전히 소켓에 대기중인 데이터를 삭제하는 것입니다. 따라서 제공된 버퍼가 작다고 결정하면 소켓에 남아있는 모든 것을 지우고 싶습니다. 소켓을 다시 닫고 열거 나 아무것도 남지 않을 때까지 수신하는 것 외에는 다른 방법이 있습니까? 최고 감사합니다 <소켓에 데이터가 남아 있는지 확인한 후 폐기하십시오.

아무 것도 남지 않을 때까지 recv하는 것이 좋습니다. (0을 반환합니다) -하지만 사전 설정 타임 아웃 (이 경우 5 초입니까?)을 기다릴 필요가 없습니다. recv 데이터 또는 시간 초과 기다립니다?

+0

설명자/설명 비트는 필요하지 않습니다. 질문을하십시오. – vezult

+0

원래 게시물에 대한 링크를 제공해 주시겠습니까? – jweyrich

답변

4

응용 프로그램 프로토콜 메시지를 구성하는 항목에 대해 TCP 수준에서 알 수 없습니다.

  • 접두사 크기와 메시지와 많은 바이트를 읽거나 바이트의 특정 순서까지
  • 읽기 발견하십시오 TCP 스트림 메시지를 구분하는 가장 일반적인 두 가지 방법은, 그러나,이 있습니다. 이러한 관점에서

는 두 개의 읽기 기능을 제공한다 일반적인 TCP 리더는 보편적으로 유용합니다 : N 바이트를 읽을

  • 구분 기호 읽은까지 읽을

독서 기능이 Tornado IOStream과 비슷합니다.

1

디자인에 결함이 있습니다.

클라이언트가 너무 작은 버퍼를 제공하는 경우 삭제할 데이터 양을 어떻게 알 수 있습니까? 메시지 끝에 도달했을 때 알려주는 데이터가 있습니까? 그렇다면 이러한 경계를 감지 할 수 있도록 입력 스트림을 코드에 버퍼해야합니다. 코드에서 스트림을 미분화 된 바이트로 보는 경우 코드에서 원칙적으로 데이터 삭제를 중지 할 수있는 코드를 알 수 없기 때문에 질문이 이해가되지 않습니다. TCP 스트림의 경우, "메시지"를 한정하는 내장 프로토콜이 없으면 연결이 닫힐 때까지는 모든 것이 든 없든 상관 없습니다.