이전 프로그램 예제에서 사용된 공통 파일을 복사하여 이 프로젝트 폴더에 붙여넣습니다. .NET 프로그래밍에서 모든 파일을 직접 가져올 수 있으며 해당 파일이 현재 프로젝트에 자동으로 복사되기 때문에 이러한 단계는 매우 이상합니다. 다음은 저자가 기본 프로그램을 프록시화하거나 몇 가지 작업을 수행하기 위해 작성한 몇 가지 “예제 플러그인”입니다: 대부분의 경우 이전 프로그램 예제는 WSAEventSelect(와 같은 방식으로 FD_READ, FD_WRITE 및 FD_CLOSE)와 같은 다른 이벤트를 처리합니다. 다른 장에 제시 된 예제 코드. 메모의 유일한 항목은 FD_WRITE 이벤트에 있습니다. 명령줄 옵션 중 하나는 데이터를 보내기 전에 RSVP PATH 메시지가 수신될 때까지 기다리는 것입니다. 이는 전송중인 데이터가 네트워크에서 사용할 수 있는 최상의 대역폭을 초과할 가능성이 있는 경우에 특히 관련이 있습니다. AbleToSend() 함수는 SIO_CHK_QOS를 호출하여 요청된 QOS 매개 변수가 사용 가능한 최상의 사용 범위 제한 내에 있는지 확인합니다. 그렇다면 데이터 전송을 시작해도 괜찮습니다. 그렇지 않으면 확인이 데이터를 보낼 때까지 기다립니다. 함수에 매개 변수가 필요한 경우 역순으로 스택에 배치해야합니다.
예를 들어 GetProcAddress에는 hModule 및 lpProcName이라는 두 가지 매개 변수가 있습니다. 먼저 ProcName의 주소를 지정한 다음 hModule을 스택에 푸시해야 합니다. 연결 지향 소켓(예: SOCK_STREAM 유형)의 경우 이름(소켓네임스페이스의 주소, 자세한 설명은 바인딩참조)을 사용하여 외부 호스트에 대한 활성 연결이 시작됩니다. 이 호출이 성공적으로 완료되면 소켓이 데이터를 보내고 받을 준비가 된 것입니다. 이름 구조의 주소 매개 변수가 모두 0이면 WSAConnect는 WSAEADDRNOTAVAIL 오류를 반환합니다. 활성 연결을 다시 연결하려는 모든 시도는 오류 코드 WSAEISCONN으로 실패합니다. 이전 프로그램 예제에서 만든 공급자 헤더 와 해당 정의 파일을 추가합니다. 첫째, 이전 프로젝트에서 파일, provider.h 및 provider.cpp를 모두 복사합니다. 핸들클라이언트Events() 함수는 클라이언트 소켓에서 발생하는 모든 이벤트를 처리합니다. 읽기 및 쓰기 이벤트는 간단하며 유일한 예외는 보내기 전에 예약 확인을 기다릴지 여부입니다. 사용자가 데이터를 보내기 전에 예약 확인이 도착할 때까지 기다리도록 지정하면 클라이언트는 FD_QOS 이벤트에서 WSA_QOS_RECEIVERS 메시지가 반환될 때까지 기다립니다. 메시지가 반환되면 FD_QOS가 수신될 때까지 데이터 전송이 발생하지 않습니다.
일반적으로 이 예제에서 가장 중요한 측면은 소켓과 FD_QOS 처리기에 QOS를 설정하는 것입니다. 예제는 약간 길지만 특별히 복잡하지는 않습니다. 대부분의 코드는 일반적인 WSAEventSelect() 코드에 지나지 않습니다. 유일한 예외는 FD_QOS 이벤트로 수행하는 것입니다. 주요 기능은 평범한 것에서 아무것도하지 않습니다. 인수는 구문 분석되고, 소켓이 만들어지며, 응용 프로그램이 서버 또는 클라이언트로 호출되는지 여부에 따라 서버 또는 클라이언트 함수가 호출됩니다. 먼저 클라이언트 연결을 살펴보겠습니다. 이 샘플에는 연결 전, 연결 중, 연결 후 또는 피어가 QOS를 로컬로 설정하도록 요청한 후에 QOS를 설정하도록 예제에 알려주는 명령줄 매개 변수가 있습니다. 클라이언트에 대해 연결하기 전에 QOS를 설정하도록 선택한 경우 소켓을 임의 포트에 바인딩한 다음 SIO_SET_QOS를 전송QOS FLOWSPEC을 호출합니다. Connect() 호출이 이루어질 때까지 피어의 주소를 알 수 없고 피어의 주소가 알려질 때까지 RSVP 세션을 시작할 수 없기 때문에 SIO_SET_QOS를 호출하기 전에 바인딩할 필요가 없습니다. 이 섹션에서는 TCP 및 UDP를 통해 QOS를 사용하는 두 가지 프로그래밍 예제를 살펴보겠습니다.