2010-04-23 4 views
0

POST가 아닌 GET 동사에서 작동하는 매우 간단한 IOCP HTTP 서버를 작성했습니다.C++ Windows IOCP - HTTP POST 데이터 누락

accept()가 연결을 기다리고있는 소켓과 청취 스레드를 만듭니다. 클라이언트가 연결되면 소켓을 차단 해제하기 위해 ioctlsocket()을 호출 한 다음 소켓을 IOCP와 연결하고 WSARecv()를 호출하여 데이터를 읽습니다.

일부 데이터는 실제로 읽혀지고 실제로 발생하면 IOCP는 GetQueuedCompletionStatus()를 통해 작업자 스레드를 깨우고 요청 데이터를 복구합니다.

모든 브라우저에서 POST 할 때만 요청 헤더를받습니다. 왜 그런가?

답변

2

TCP 소켓의 모든 읽기는 사용자가 제공하는 버퍼의 버퍼 크기에 따라 1 바이트와 총 전송량 사이의 모든 값을 반환합니다. 웹 서버가 두 개의 별도 쓰기로 데이터를 전송하고 이것이 서버의 TCP 스택에 의해 두 개의 별도 데이터 블록으로 전송되는 경우가 발생할 수 있습니다. 데이터가 도착했기 때문에 읽기가 완료됩니다. 프로그래머가 예상하는 모든 데이터가 도착할 때까지 또는 버퍼가 가득 찰 때까지 읽기는 대기하지 않습니다.

네트워크 문제는 라우터가 일을 파편화 할 수 있고 데이터 손실로 인해 재전송되는 동안 문제를 혼란스럽게 할 수 있습니다.

항상 TCP로 작업 할 때 읽기는 항상 한 번에 한 바이트 만 반환하고 그에 따라 코드한다고 가정해야합니다. 그런 식으로 일하면 항상 효과가 있습니다.

다른 읽기를 실행하면 나머지 데이터가 도착할 것입니다.

here을 찾을 수있는 무료 IOCP 서버 프레임 워크 (클라이언트도 마찬가지입니다.)를보고 싶을 수도 있습니다. 당신은 이미 일을하고있는 것처럼 들리지만 때로는 일을하는 다른 방식을 볼 수있는 것이 도움이됩니다.

처리하기 전에 데이터를 축적해야 할 때 나는 다음과 같은 접근 방식을 취하는 경향이 있습니다. 읽기를 실행하고 완료 될 때까지 기다렸다가, 내가 가지고있는 것을 보았습니다. 필요한 모든 것이없고 버퍼에 여전히 공간이 있으면 WSABUF을 조정하여 끝까지 가리 키도록하십시오. 동일한 버퍼에 방금 도착한 현재 데이터를 읽고 다른 읽기를 발행합니다. 우리는 그 데이터를 처리 할 충분한 데이터가있을 때까지 또는 동일한 데이터를 얻기 위해 또 다른 버퍼를 추가해야 할 때까지 동일한 버퍼에 누적합니다.