여러 읽기 및 쓰기의 순서를 보장하는 개념을 설명하기 위해 다소 모순된 예제를 마련했습니다. 이전 문서에서 개발한 패킷 에코 서버는 다음과 같이 변경되었습니다. 이것은 우리가 이전 문서에서 개발 한 예제 서버에서 지금까지 수행 한 것입니다. 그러나 이렇게 하면 성능이 저하되지만 데이터가 이미 도착한 후 수신을 게시하는 것보다 데이터가 실제로 와이어에 도착할 때 수신 보류 중인 것이 항상 더 수행됩니다. WSARecv 호출이 여러 개 있으면 항상 보류 중인 호출이 있음을 확인할 수 있습니다. 또한 문제는 여러 WSARecvs()를 갖는 것으로 제한되지 않습니다. 서버 프레임워크에서는 사용자의 스레드에서 IO 완료 포트를 사용하여 IO 스레드 풀로 모든 소켓 IO 호출을 마샬링합니다. 즉, 사용자 스레드가 소켓에 여러 개의 연속 쓰기를 실행하고 정의되지 않은 순서로 실행될 가능성이 있습니다. 메시지 지향 소켓(예: SOCK_DGRAM 유형)의 경우 들어오는 메시지가 버퍼의 총 크기까지 버퍼에 배치되고 겹친 소켓에 대해 완료 표시가 발생합니다.

메시지가 버퍼보다 크면 버퍼는 메시지의 첫 번째 부분으로 채워져 있습니다. MSG_PARTIAL 기능이 기본 서비스 공급자에서 지원되는 경우 MSG_PARTIAL 플래그는 lpFlags로 설정되고 후속 수신 작업은 나머지 메시지를 검색합니다. MSG_PARTIAL가 지원되지 않지만 프로토콜이 신뢰할 수 있는 경우 WSARecv는 WSAEMSGSIZE 오류를 생성하고 더 큰 버퍼를 가진 후속 수신 작업을 사용하여 전체 메시지를 검색할 수 있습니다. 그렇지 않으면(즉, 프로토콜이 신뢰할 수 없고 MSG_PARTIAL을 지원하지 않음) 초과 데이터가 손실되고 WSARecv가 WSAEMSGSIZE 오류를 생성합니다. 큰 패킷 에코 서버는 여기에서 다운로드할 수 있습니다. 텔넷을 사용한 테스트는 더 복잡하지만 여기에서 개발한 테스트 하네스를 사용하여 테스트하는 것이 더 쉬울 수 있습니다. 이전 예제와 마찬가지로 서버는 명명된 이벤트가 설정된 다음 종료될 때까지 실행됩니다. 다운로드의 일부로 사용할 수 있는 매우 간단한 서버 종료 프로그램은 서버에 대한 꺼짐 스위치를 제공합니다.

이 예제는 코드의 중첩된 I/O 처리 부분을 별도의 스레드로 이동하고 주 응용 프로그램 스레드가 추가 연결 요청을 서비스할 수 있도록 하여 두 개 이상의 소켓을 처리하도록 쉽게 확장할 수 있습니다.