2012-03-29 4 views
0
  1. 클라이언트 쪽에서는 항상 전체 응답을 받거나 한 가지 정렬에서는 응답의 절반을 받고 다른 정렬에서는 나머지 절반을 얻을 기회가 있습니다 (예 : recv() API에 대해 정의 됨).
  2. recv() API에서 채워진 두 가지 응답을받을 가능성이 있습니까?

답변

1

요청한 크기까지 모든 데이터를 얻을 수 있습니다. 실제로 수신 한 데이터의 양을 보려면 반환 값을 항상 확인하십시오.

귀하의 질문에 답하십시오 : 완전한 "응답"보다 적게받을 수도 있고 완전한 "응답"이상을 얻을 수도 있습니다. 하나 이상의 완전한 응답 메시지를 받으면 두 개 또는 한 개 반 또는 두 개 이상을 얻을 수 있습니다.

3

TCP는 메시지 경계를 보존하지 않습니다. 노출되는 것은 모두 바이트 스트림입니다. 따라서 한 쪽에서 호출하는 send()는 다른 쪽의 recv()와 일치하지 않을 수 있습니다. 예를 들어, 다음과 같은 일이 일어날 수 있습니다

  • 전화가 다시 100 바이트) (통화 전송, 100 바이트()로 보내
  • B는 (RECV를 호출) 및 도착 200 바이트 (Nagle's algorithm 참조)
  • 반대로

또는 :

  • 호출() 1 MiB 크기
  • B는 RECV()를 호출로, 512 킬로바이트 가져, 다음 RECV (호출)을 다시 가져옵니다 보내 512 KiB (버퍼 공간은 수신기 또는 송신 측에서 불충분했습니다). 당신의 "패딩"질문에 대해서는

하지 당신이 RECV의 반환 값을 확인이 것을() 실제로 버퍼에 얼마나 많은 바이트를 반환 위치를 확인할 수 있습니다. [6 바이트 : 데이터 사이즈 헤더]

0

이 방법을 보낼 전달 된 데이터 블록을 형성 할 수있다 [데이터]

이어서 각 반복에서 1 바이트 판독 루프 RECV()를 호출한다. '데이터 크기 헤더'(처음 6 바이트)를 읽고 원하는 크기의 버퍼를 할당 한 다음 나머지 바이트를 읽습니다.