TCP 소켓의 모든 읽기는 사용자가 제공하는 버퍼의 버퍼 크기에 따라 1 바이트와 총 전송량 사이의 모든 값을 반환합니다. 웹 서버가 두 개의 별도 쓰기로 데이터를 전송하고 이것이 서버의 TCP 스택에 의해 두 개의 별도 데이터 블록으로 전송되는 경우가 발생할 수 있습니다. 데이터가 도착했기 때문에 읽기가 완료됩니다. 프로그래머가 예상하는 모든 데이터가 도착할 때까지 또는 버퍼가 가득 찰 때까지 읽기는 대기하지 않습니다.
네트워크 문제는 라우터가 일을 파편화 할 수 있고 데이터 손실로 인해 재전송되는 동안 문제를 혼란스럽게 할 수 있습니다.
항상 TCP로 작업 할 때 읽기는 항상 한 번에 한 바이트 만 반환하고 그에 따라 코드한다고 가정해야합니다. 그런 식으로 일하면 항상 효과가 있습니다.
다른 읽기를 실행하면 나머지 데이터가 도착할 것입니다.
here을 찾을 수있는 무료 IOCP 서버 프레임 워크 (클라이언트도 마찬가지입니다.)를보고 싶을 수도 있습니다. 당신은 이미 일을하고있는 것처럼 들리지만 때로는 일을하는 다른 방식을 볼 수있는 것이 도움이됩니다.
처리하기 전에 데이터를 축적해야 할 때 나는 다음과 같은 접근 방식을 취하는 경향이 있습니다. 읽기를 실행하고 완료 될 때까지 기다렸다가, 내가 가지고있는 것을 보았습니다. 필요한 모든 것이없고 버퍼에 여전히 공간이 있으면 WSABUF
을 조정하여 끝까지 가리 키도록하십시오. 동일한 버퍼에 방금 도착한 현재 데이터를 읽고 다른 읽기를 발행합니다. 우리는 그 데이터를 처리 할 충분한 데이터가있을 때까지 또는 동일한 데이터를 얻기 위해 또 다른 버퍼를 추가해야 할 때까지 동일한 버퍼에 누적합니다.