이름 확인 데이터 구조

이름 확인 함수 전체에서 광범위하게 사용되는 몇 가지 중요한 데이터 구조가 있습니다.

WSAQUERYSET 구조는 WSALookupServiceBegin에 대한 쿼리를 형성하는 데 사용되며 WSALookupServiceNext에 대한 쿼리 결과를 제공하는 데 사용됩니다. 다른 여러 구조체에 대한 포인터를 포함하므로 복잡한 구조체이며, 그 중 일부는 여전히 다른 구조를 참조합니다. WSAQUERYSET 구조체와 참조하는 구조체 간의 관계는 다음과 같습니다.

wsaqueryset과 관련 구조체 간의 관계

WSAQUERYSET 구조 내에서 멤버의 대부분은 자체 설명이지만 일부는 추가 설명을 받을 자격이 있습니다. dwSize 멤버는 항상 sizeof(WSAQUERYSET)로 채워져야 합니다. 이는 네임스페이스 공급자가 시간이 지남에 따라 나타날 수 있는 WSAQUERYSET 구조체의 다른 버전을 검색하고 조정하는 데 사용되기 때문에 항상 sizeof(WSAQUERYSET)로 채워져야 합니다.

dwOutputFlags 멤버는 네임스페이스 공급자가 쿼리 결과에 대한 추가 정보를 제공하는 데 사용됩니다. 자세한 내용은 WSALookupServiceNext 함수를 참조하세요.

lpversion 멤버가 참조하는 WSAECOMPARATOR 구조체는 쿼리 제약 조건과 결과 모두에 사용됩니다. 쿼리의 경우 dwVersion 멤버는 원하는 버전의 서비스를 나타냅니다. ecHow 멤버는 비교를 수행할 수 있는 방법을 지정하는 열거형 형식입니다. 선택 항목은 버전에서 정확히 일치해야 하는 COMP_EQUALS 또는 서비스의 버전 번호가 dwVersion 멤버의 값보다 작지 않도록 지정하는 COMP_NOTLESS.

dwNameSpacelpNSProviderId의 해석은 구조체가 사용되는 방식에 따라 달라지고 이 구조를 활용하는 개별 함수 설명에 자세히 설명되어 있습니다.

lpszContext 멤버는 계층 구조 네임스페이스에 적용되며 쿼리의 시작점 또는 서비스가 상주하는 계층 내의 위치를 지정합니다. 일반 규칙은 다음과 같습니다.

  • NULL 값인 빈("")은 기본 컨텍스트에서 검색을 시작합니다.
  • "\" 값은 네임스페이스의 맨 위에서 검색을 시작합니다.
  • 다른 값은 지정된 지점에서 검색을 시작합니다.

포함을 지원하지 않는 공급자는 "" 또는 "\" 이외의 항목이 지정된 경우 오류를 반환할 수 있습니다. 그룹과 같이 제한된 포함을 지원하는 공급자는 "", '\" 또는 지정된 지점을 수락해야 합니다. 컨텍스트는 네임스페이스별로 다릅니다. dwNameSpace 멤버가 NS_ALL 경우 모든 네임스페이스에서 인식되므로 "" 또는 "\"만 컨텍스트로 전달되어야 합니다.

lpszQueryString 멤버는 "FTP/TCP"와 같이 잘 알려진 서비스 및 전송 프로토콜 이름을 설명하는 문자열과 같은 추가 네임스페이스 관련 쿼리 정보를 제공하는 데 사용됩니다.

lpafpProtocols 멤버에서 참조하는 AFPROTOCOLS 구조체는 쿼리 목적으로만 사용되며 쿼리를 제한하는 프로토콜 목록을 제공합니다. 프로토콜 값은 주소 패밀리의 컨텍스트 내에서만 의미가 있으므로 이러한 프로토콜은 (주소 패밀리, 프로토콜) 쌍으로 표시됩니다.

lpcsaBuffer 멤버가 참조하는 CSADDR_INFO 구조체의 배열에는 서비스가 수신 대기를 설정하는 데 사용하거나 클라이언트가 서비스에 대한 연결을 설정하는 데 사용하는 데 필요한 모든 정보가 포함됩니다. LocalAddrRemoteAddr 멤버는 모두 SOCKET_ADDRESS 구조를 직접 포함합니다.

서비스는 LocalAddr.lpSockaddr-sa_family>, iSocketTypeiProtocol의 튜플을 매개 변수로 사용하여 소켓 또는 WSASocket 함수를 호출하여 소켓을 만듭니다. 서비스는 LocalAddr.lpSockaddrLocalAddr.lpSockaddrLength를 매개 변수로 사용하여 바인딩 함수를 호출하여 소켓을 로컬 주소에 바인딩합니다.

클라이언트는 LocalAddr.lpSockaddr-sa_family>, iSocketTypeiProtocol의 튜플을 매개 변수로 사용하여 소켓 또는 WSASocket 함수를 호출하여 소켓을 만듭니다. 클라이언트는 connect, ConnectEx 또는 WSAConnect 함수를 사용하여 원격 연결을 만들 때 RemoteAddr.lpSockaddrRemoteAddr.lpSockaddrLength의 조합을 매개 변수로 사용합니다.

서비스 클래스 데이터 구조

새 서비스 클래스가 설치되면 WSASERVICECLASSINFO 구조체를 준비하고 제공해야 합니다. 또한 이 구조는 특정 네임스페이스에 적용되는 일련의 멤버를 포함하는 하위 구조로 구성됩니다. 클래스 정보 데이터 구조는 다음과 같습니다.

서비스 클래스 데이터 구조 아키텍처

각 서비스 클래스에 대해 단일 WSASERVICECLASSINFO 구조가 있습니다. WSASERVICECLASSINFO 구조 내에서 서비스 클래스의 고유 식별자는 lpServiceClassId 멤버에 포함되며 연결된 표시 문자열은 lpServiceClassName 멤버에 의해 참조됩니다. WSAGetServiceClassNameByClassId 함수에서 반환되는 문자열입니다.

WSASERVICECLASSINFO 구조체의 lpClassInfos 멤버는 각각 지정된 네임스페이스에 적용되는 명명되고 형식화된 멤버를 제공하는 WSANSCLASSINFO 구조체의 배열을 참조합니다. lpszName 멤버에 대한 값의 예로는 "SapId", "TcpPort", "UdpPort" 등이 있습니다. 이러한 문자열은 일반적으로 dwNameSpace 멤버에서 식별된 네임스페이스에만 적용됩니다. dwValueType 멤버의 일반적인 값은 REG_DWORD, REG_SZ 등일 수 있습니다. dwValueSize 멤버는 lpValue가 가리키는 데이터 항목의 길이를 나타냅니다.

WSAInstallServiceClass 함수가 호출될 때 WSASERVICECLASSINFO 구조에 표시되는 데이터의 전체 컬렉션이 각 네임스페이스 공급자에게 제공됩니다. 그런 다음 각 개별 네임스페이스 공급자는 WSANSCLASSINFO 구조 목록을 살펴보고 해당 정보를 유지합니다.

AFPROTOCOLS

CSADDR_INFO

이름 확인 모델

프로토콜 독립적 이름 확인

등록 및 이름 확인

SOCKET_ADDRESS

이름 확인 함수 요약

WSAECOMPARATOR

WSAGetServiceClassNameByClassId

WSAInstallServiceClass

WSALookupServiceBegin

WSAQUERYSET

WSASERVICECLASSINFO