Strutture dei dati di risoluzione dei nomi
Esistono diverse strutture di dati importanti usate ampiamente in tutte le funzioni di risoluzione dei nomi.
strutture dati Query-Related
La struttura WSAQUERYSET viene usata per formare query per WSALookupServiceBegin e usata per fornire i risultati delle query per WSALookupServiceNext. Si tratta di una struttura complessa poiché contiene puntatori a diverse altre strutture, alcune delle quali fanno riferimento ancora ad altre strutture. La relazione tra la struttura WSAQUERYSET e le strutture a cui fa riferimento viene illustrata come indicato di seguito.
All'interno della struttura WSAQUERYSET , la maggior parte del membro è autoesplicativa, ma alcuni meritano spiegazioni aggiuntive. Il membro dwSize deve sempre essere compilato con sizeof(WSAQUERYSET), come viene usato dai provider di spazi dei nomi per rilevare e adattare a versioni diverse della struttura WSAQUERYSET che possono essere visualizzate nel tempo.
Il membro dwOutputFlags viene usato da un provider di spazi dei nomi per fornire informazioni aggiuntive sui risultati delle query. Per informazioni dettagliate, vedere la funzione WSALookupServiceNext .
La struttura WSAECOMPARATOR a cui fa riferimento il membro lpversion viene usata sia per il vincolo di query che per i risultati. Per le query, il membro dwVersion indica la versione desiderata del servizio. Il membro ecHow è un tipo enumerato che specifica come è possibile effettuare il confronto. Le scelte sono COMP_EQUALS che richiedono che si verifichi una corrispondenza esatta nella versione o COMP_NOTLESS che specifica che il numero di versione del servizio non sia minore del valore del membro dwVersion .
L'interpretazione di dwNameSpace e lpNSProviderId dipende dal modo in cui la struttura viene usata ed è descritta ulteriormente nelle singole descrizioni delle funzioni che usano questa struttura.
Il membro lpszContext si applica agli spazi dei nomi gerarchici e specifica il punto iniziale di una query o la posizione all'interno della gerarchia in cui risiede il servizio. Le regole generali sono le seguenti:
- Un valore null vuoto ("") avvia la ricerca nel contesto predefinito.
- Il valore "\" avvia la ricerca nella parte superiore dello spazio dei nomi.
- Qualsiasi altro valore avvia la ricerca nel punto designato.
I provider che non supportano il contenimento possono restituire un errore se viene specificato un errore diverso da "" o "\". I provider che supportano il contenimento limitato, ad esempio i gruppi, devono accettare "", '\" o un punto designato. I contesti sono specifici dello spazio dei nomi. Se il membro dwNameSpace è NS_ALL, è necessario passare solo "" o "\" come contesto poiché questi vengono riconosciuti da tutti gli spazi dei nomi.
Il membro lpszQueryString viene usato per fornire informazioni di query aggiuntive specifiche dello spazio dei nomi, ad esempio una stringa che descrive un nome noto del servizio e del protocollo di trasporto, come in "FTP/TCP".
La struttura AFPROTOCOLS a cui fa riferimento il membro lpafpProtocols viene usata solo a scopo di query e fornisce un elenco di protocolli per limitare la query. Questi protocolli sono rappresentati come coppie (famiglia di indirizzi, protocollo), poiché i valori del protocollo hanno significato solo nel contesto di una famiglia di indirizzi.
La matrice della struttura CSADDR_INFO a cui fa riferimento il membro lpcsaBuffer contiene tutte le informazioni necessarie per un servizio da usare per stabilire un ascolto o per un client da usare per stabilire una connessione al servizio. I membri LocalAddr e RemoteAddr contengono direttamente una struttura SOCKET_ADDRESS.
Un servizio creerebbe un socket chiamando la funzione socket o WSASocket usando la tupla di LocalAddr.lpSockaddr-sa_family>, iSocketType e iProtocol come parametri. Un servizio associa il socket a un indirizzo locale chiamando la funzione di associazione usando LocalAddr.lpSockaddr e LocalAddr.lpSockaddrLength come parametri.
Un client crea il socket chiamando la funzione socket o WSASocket usando la tupla di LocalAddr.lpSockaddr-sa_family>, iSocketType e iProtocol come parametri. Un client usa la combinazione di RemoteAddr.lpSockaddr e RemoteAddr.lpSockaddrLength come parametri quando si effettua una connessione remota usando la funzione connect, ConnectEx o WSAConnect .
Strutture dei dati della classe di servizio
Quando viene installata una nuova classe di servizio, è necessario preparare e fornire una struttura WSASERVICECLASSINFO . Questa struttura è costituita anche da sottostruttura che contengono una serie di membri che si applicano a spazi dei nomi specifici. Una struttura di dati delle informazioni di classe è la seguente:
Per ogni classe di servizio è presente una singola struttura WSASERVICECLASSINFO . All'interno della struttura WSASERVICECLASSINFO , l'identificatore univoco della classe di servizio è contenuto nel membro lpServiceClassId e viene fatto riferimento a una stringa di visualizzazione associata dal membro lpServiceClassName . Questa è la stringa restituita dalla funzione WSAGetServiceClassNameByClassId .
Il membro lpClassInfos nella struttura WSASERVICECLASSINFO fa riferimento a una matrice di strutture WSANSCLASSINFO , ognuna delle quali fornisce un membro denominato e tipizzato che si applica a uno spazio dei nomi specificato. Esempi di valori per il membro lpszName includono: "SapId", "TcpPort", "UdpPort" e così via. Queste stringhe sono in genere specifiche dello spazio dei nomi identificato nel membro dwNameSpace . I valori tipici per il membro dwValueType potrebbero essere REG_DWORD, REG_SZ e così via. Il membro dwValueSize indica la lunghezza dell'elemento dati a cui punta lpValue.
L'intera raccolta di dati rappresentata in una struttura WSASERVICECLASSINFO viene fornita a ogni provider di spazi dei nomi quando viene richiamata la funzione WSAInstallServiceClass . Ogni singolo provider di spazi dei nomi consente quindi di analizzare l'elenco delle strutture WSANSCLASSINFO e conservare le informazioni applicabili.
Argomenti correlati