wsaasyncselect 예제

이 예제에서는 기본 제공 ServerSocket 클래스를 사용하여 여러 사용자를 처리합니다. WSAWaitForMultipleEvents()가 이벤트 개체의 네트워크 이벤트 알림을 받으면 함수를 반환한 이벤트 개체를 나타내는 값을 반환합니다. 따라서 응용 프로그램은 이벤트 배열에서 신호된 이벤트를 참조하고 이벤트와 연결된 소켓과 일치시켜 특정 소켓에서 사용할 수 있는 네트워크 이벤트 유형을 결정할 수 있습니다. 이벤트 배열에서 이벤트를 참조할 때 WSAWaitForMultipleEvents() 반환 값에서 미리 정의된 WSA_WAIT_EVENT_0을 뺀 반환 값을 사용하여 이벤트를 참조해야 합니다. 예: Windows 그래픽 사용자 인터페이스에 DNS 서비스 검색을 올바르게 통합하려면 WinSock WSAAsyncSelect 함수를 사용합니다. WSAAsyncSelect 기능은 소켓 기반 네트워크 이벤트를 Windows 메시지 루프에 통합합니다. Windows 코드에서 이 것을 사용하려면 먼저 DNSServiceRef 개체를 만들고 초기화해야 합니다. 그런 다음 WSAAsyncSelect 함수를 호출하여 DNSServiceRef 개체의 소켓을 Windows 메시지 루프와 연결합니다. WSAAsyncSelect에는 DNSServiceRef 개체에 대한 소켓, 메시지를 받을 창, 이벤트가 발생할 때 보낼 메시지, 관심 있는 네트워크 이벤트에 대한 비트 마스크의 네 가지 인수가 필요합니다. 이에 대한 간단한 예는 아래에 제공됩니다.

이 예제에서는 NULL DNSServiceRef 개체를 만들고 DNSServiceBrowse를 사용하여 해당 참조를 초기화한 다음 WSAAsyncSelect를 사용하여 작업 루프에 추가하는 방법을 볼 수 있습니다. 이벤트가 신호를 볼 때마다 두 개 이상의 네트워크 이벤트 유형이 발생할 수 있습니다. 예를 들어 사용 중인 서버 응용 프로그램이 FD_READ 및 FD_WRITE 알림을 동시에 받을 수 있습니다. 다음은 기본 :usocket 예제입니다 (일반적인 Lisp와 함께 작동해야합니다): 라켓 웹 사이트의 첫 페이지에서 예제 에코 서버 : s 매개 변수는 우리가 관심있는 소켓을 나타냅니다. hWnd 매개 변수는 네트워크 이벤트가 발생할 때 메시지를 수신하는 창 또는 대화 상자를 식별하는 창 핸들입니다. wMsg 매개 변수는 네트워크 이벤트가 발생할 때 수신할 메시지를 식별합니다. 이 메시지는 hWnd 창 핸들로 식별되는 창에 게시됩니다. 응용 프로그램은 일반적으로 네트워크 창 메시지와 미리 정의된 표준 창 메시지의 혼동을 방지하기 위해 이 메시지를 Windows WM_USER 값보다 큰 값으로 설정합니다. 마지막 매개 변수인 lEvent는 응용 프로그램에 관심이 있는 표 5-3에 나열된 네트워크 이벤트의 조합을 지정하는 비트 마스크를 나타냅니다. 대부분의 응용 프로그램은 일반적으로 FD_READ, FD_WRITE, FD_ACCEPT, FD_CONNECT 및 FD_CLOSE 네트워크 이벤트 유형에 관심이 있습니다. 물론 FD_ACCEPT 또는 FD_CONNECT 형식의 사용은 응용 프로그램이 클라이언트인지 서버인지에 따라 달라집니다. 응용 프로그램이 둘 이상의 네트워크 이벤트에 관심이 있는 경우 형식에 대해 조금씩 또는 이를 수행하고 lEvent에 할당하여 이 필드를 설정하기만 하면 됩니다.

예를 들어 이 구현은 예제를 불필요하게 이해하기 어렵게 만들 수 있는 추가(종종 혼동되는) 개념이기 때문에 코루틴에 의존하지 않습니다. 대신 차단되지 않은 소켓 클라이언트 개체(1마이크로초 동안 차단)의 테이블을 사용하여 각 개체에 에코할 줄이 있는지 또는 삭제를 보증하는 오류가 있는지 여부를 확인합니다.