Estructuras de datos de resolución de nombres
Hay varias estructuras de datos importantes que se usan ampliamente en las funciones de resolución de nombres.
estructuras de datos de Query-Related
La estructura WSAQUERYSET se usa para formar consultas para WSALookupServiceBegin y se usa para entregar resultados de consulta para WSALookupServiceNext. Es una estructura compleja, ya que contiene punteros a otras estructuras, algunas de las cuales hacen referencia a otras estructuras. La relación entre la estructura WSAQUERYSET y las estructuras a las que hace referencia se muestra de la siguiente manera.
Dentro de la estructura WSAQUERYSET , la mayoría del miembro son autoexplicativos, pero algunos merecen una explicación adicional. El miembro dwSize siempre debe rellenarse con sizeof(WSAQUERYSET), ya que lo usan los proveedores de espacios de nombres para detectar y adaptarse a diferentes versiones de la estructura WSAQUERYSET que puede aparecer con el tiempo.
Un proveedor de espacios de nombres usa el miembro dwOutputFlags para proporcionar información adicional sobre los resultados de la consulta. Para obtener más información, consulte la función WSALookupServiceNext .
La estructura WSAECOMPARATOR a la que hace referencia el miembro lpversion se usa tanto para la restricción de consulta como para los resultados. En el caso de las consultas, el miembro dwVersion indica la versión deseada del servicio. El miembro ecHow es un tipo enumerado que especifica cómo se puede realizar la comparación. Las opciones son COMP_EQUALS que requieren que se produzca una coincidencia exacta en la versión, o COMP_NOTLESS que especifica que el número de versión del servicio no sea inferior al valor del miembro dwVersion .
La interpretación de dwNameSpace y lpNSProviderId depende de cómo se usa la estructura y se describe más en las descripciones de función individuales que utilizan esta estructura.
El miembro lpszContext se aplica a los espacios de nombres jerárquicos y especifica el punto inicial de una consulta o la ubicación dentro de la jerarquía donde reside el servicio. Las reglas generales son las siguientes:
- Un valor de NULL, blank ("") inicia la búsqueda en el contexto predeterminado.
- Un valor de "\" inicia la búsqueda en la parte superior del espacio de nombres.
- Cualquier otro valor inicia la búsqueda en el punto designado.
Los proveedores que no admiten contención pueden devolver un error si se especifica algo distinto de "" o "\". Los proveedores que admiten contención limitada, como grupos, deben aceptar "", "\" o un punto designado. Los contextos son específicos del espacio de nombres. Si el miembro dwNameSpace es NS_ALL, solo se debe pasar "" o "\" como contexto, ya que todos los espacios de nombres los reconocen.
El miembro lpszQueryString se usa para proporcionar información de consulta adicional específica del espacio de nombres, como una cadena que describe un nombre de protocolo de transporte y servicio conocido, como en "FTP/TCP".
La estructura AFPROTOCOLS a la que hace referencia el miembro lpafpProtocols se usa únicamente con fines de consulta y proporciona una lista de protocolos para restringir la consulta. Estos protocolos se representan como pares (familia de direcciones, protocolo), ya que los valores de protocolo solo tienen significado dentro del contexto de una familia de direcciones.
La matriz de la estructura de CSADDR_INFO a la que hace referencia el miembro lpcsaBuffer contiene toda la información necesaria para que un servicio se use para establecer una escucha o para que un cliente use para establecer una conexión con el servicio. Los miembros LocalAddr y RemoteAddr contienen directamente una estructura de SOCKET_ADDRESS .
Un servicio crearía un socket llamando a la función socket o WSASocket mediante la tupla de LocalAddr.lpSockaddr-sa_family>, iSocketType y iProtocol como parámetros. Un servicio enlazaría el socket a una dirección local llamando a la función bind mediante LocalAddr.lpSockaddr y LocalAddr.lpSockaddrLength como parámetros.
Un cliente crea su socket llamando a la función socket o WSASocket mediante la tupla de LocalAddr.lpSockaddr-sa_family>, iSocketType y iProtocol como parámetros. Un cliente usa la combinación de RemoteAddr.lpSockaddr y RemoteAddr.lpSockaddrLength como parámetros al realizar una conexión remota mediante la función connect, ConnectEx o WSAConnect .
Estructuras de datos de clase de servicio
Cuando se instala una nueva clase de servicio, se debe preparar y proporcionar una estructura WSASERVICECLASSINFO . Esta estructura también consta de subestructuras que contienen una serie de miembros que se aplican a espacios de nombres específicos. Una estructura de datos de información de clase es la siguiente:
Para cada clase de servicio, hay una única estructura WSASERVICECLASSINFO . Dentro de la estructura WSASERVICECLASSINFO , el identificador único de la clase de servicio se encuentra en el miembro lpServiceClassId y el miembro lpServiceClassName hace referencia a una cadena de presentación asociada. Esta es la cadena devuelta por la función WSAGetServiceClassNameByClassId .
El miembro lpClassInfos de la estructura WSASERVICECLASSINFO hace referencia a una matriz de estructuras WSANSCLASSINFO , cada una de las cuales proporciona un miembro con nombre y con tipo que se aplica a un espacio de nombres especificado. Algunos ejemplos de valores para el miembro lpszName son: "SapId", "TcpPort", "UdpPort", etc. Estas cadenas suelen ser específicas del espacio de nombres identificado en el miembro dwNameSpace . Los valores típicos del miembro dwValueType pueden ser REG_DWORD, REG_SZ, etc. El miembro dwValueSize indica la longitud del elemento de datos al que apunta lpValue.
Toda la colección de datos representados en una estructura WSASERVICECLASSINFO se proporciona a cada proveedor de espacios de nombres cuando se invoca la función WSAInstallServiceClass . A continuación, cada proveedor de espacios de nombres individual recorre la lista de estructuras WSANSCLASSINFO y conserva la información aplicable.
Temas relacionados