Platform SDK: Windows Sockets

Query-Related Data Structures in the SPI

The WSAQUERYSET structure is used to form queries for NSPLookupServiceBegin, and used to deliver query results for NSPLookupServiceNext. It is a complex structure since it contains pointers to several other structures, some of which reference still other structures. The relationship between WSAQUERYSET and the structures it references is illustrated as follows:

Within the WSAQUERYSET structure, most of the members are self explanatory, but some deserve additional explanation. The dwSize will be filled in with sizeof(WSAQUERYSET), and can be used by name space providers to detect and adapt to different versions of the WSAQUERYSET structure that may appear over time.

The dwOutputFlags member is used by a name space provider to provide additional information about query results. For details, see NSPLookupServiceNext.

The WSAECOMPARATOR structure referenced by lpversion is used for both query constraint and results. For queries, the dwVersion member indicates the desired version of the service. The ecHow member is an enumerated type which specifies how the comparison will be made. The choices are COMP_EQUALS which requires that an exact match in version occurs, or COMP_NOTLESS which specifies that the service's version number be no less than the value of dwVersion.

The interpretation of dwNameSpace and lpNSProviderId depends upon how the structure is being used and is described further in the individual function descriptions that utilize this structure.

The lpszContext member applies to hierarchical name spaces, and specifies the starting point of a query or the location within the hierarchy where the service resides. The general rules are:

Providers that do not support containment may return an error if anything other than "" or "\" is specified. Providers that support limited containment, such as groups, should accept "", '\", or a designated point. Contexts are name space specific. If dwNameSpace is NS_ALL, then only "" or "\" should be passed as the context since these are recognized by all name spaces.

The lpszQueryString member is used to supply additional, name space-specific query information such as a string describing a well-known service and transport protocol name, as in "ftp/tcp".

The AFPROTOCOLS structure referenced by lpafpProtocols is used for query purposes only, and supplies a list of protocols to constrain the query. These protocols are represented as (address family, protocol) pairs, since protocol values only have meaning within the context of an address family.

The array of CSADDR_INFO structure referenced by lpcsaBuffer contains all of the information needed for either a service to use in establishing a listen, or a client to use in establishing a connection to the service. The LocalAddr and RemoteAddr members both directly contain a SOCKET_ADDRESS structure. A service would create a socket using the tuple (LocalAddr.lpSockaddr->sa_family, iSocketType, iProtocol). It would bind the socket to a local address using LocalAddr.lpSockaddr, and LocalAddr.lpSockaddrLength. The client creates its socket with the tuple (RemoteAddr.lpSockaddr->sa_family, iSocketType, iProtocol), and uses the combination of RemoteAddr.lpSockaddr, and RemoteAddr.lpSockaddrLength when making a remote connection.