wsarecv 예제

이 예제는 코드의 중첩된 I/O 처리 부분을 별도의 스레드로 이동하고 주 응용 프로그램 스레드가 추가 연결 요청을 서비스할 수 있도록 하여 두 개 이상의 소켓을 처리하도록 쉽게 확장할 수 있습니다. 위의 예는 피하기 쉽고 단일 소켓에서 여러 WSARecv 요청이 없습니다. 이것은 우리가 이전 문서에서 개발 한 예제 서버에서 지금까지 수행 한 것입니다. 그러나 이렇게 하면 성능이 저하되지만 데이터가 이미 도착한 후 수신을 게시하는 것보다 데이터가 실제로 와이어에 도착할 때 수신 보류 중인 것이 항상 더 수행됩니다. WSARecv 호출이 여러 개 있으면 항상 보류 중인 호출이 있음을 확인할 수 있습니다. 또한 문제는 여러 WSARecvs()를 갖는 것으로 제한되지 않습니다. 서버 프레임워크에서는 사용자의 스레드에서 IO 완료 포트를 사용하여 IO 스레드 풀로 모든 소켓 IO 호출을 마샬링합니다. 즉, 사용자 스레드가 소켓에 여러 개의 연속 쓰기를 실행하고 정의되지 않은 순서로 실행될 가능성이 있습니다. 큰 패킷 에코 서버는 여기에서 다운로드할 수 있습니다. 텔넷을 사용한 테스트는 더 복잡하지만 여기에서 개발한 테스트 하네스를 사용하여 테스트하는 것이 더 쉬울 수 있습니다.

이전 예제와 마찬가지로 서버는 명명된 이벤트가 설정된 다음 종료될 때까지 실행됩니다. 다운로드의 일부로 사용할 수 있는 매우 간단한 서버 종료 프로그램은 서버에 대한 꺼짐 스위치를 제공합니다. 바이트 스트림 스타일 소켓(예: SOCK_STREAM 유형)의 경우 들어오는 데이터는 버퍼가 채워지거나 연결이 닫히거나 내부적으로 버퍼링된 데이터가 모두 소모될 때까지 버퍼에 배치됩니다. 들어오는 데이터가 모든 버퍼를 채우는지 여부에 관계없이 겹친 소켓에 대해 완료 표시가 발생합니다. 여러 스레드가 있는 IO 완료 포트를 사용할 때 미묘한 문제가 있습니다. IO 완료 포트를 사용하는 작업은 항상 제출된 순서대로 완료되지만 스레드 일정 문제는 완료와 관련된 실제 작업이 정의되지 않은 순서로 처리된다는 것을 의미할 수 있습니다. 예를 들어 소켓에 세 개의 WSARecv() 요청을 제출하는 경우 제출한 순서대로 완료할 수 있지만 IO 완료 포트를 서비스하는 스레드 2개가 있는 경우 완료 중 2개가 동시에 처리될 수 있습니다. `제1` WSARecv() 완료를 처리하는 스레드가 중단되면 제2가 제1 전에 완전히 처리될 수 있다. 이것은 두 스레드가 실제로 동시에 실행될 수 있는 여러 프로세서가 있는 컴퓨터에서 발생할 가능성이 더 높지만 단일 프로세서 상자에서도 가능합니다. 언제나 처럼, 이것은 아마 생산에 소프트웨어를 출시 할 때까지 얼굴을 표시 하지 않습니다 미묘한 문제의 종류…

여러 읽기 및 쓰기의 순서를 보장하는 개념을 설명하기 위해 다소 모순된 예제를 마련했습니다.