WSAAsyncGetServByPort
The Windows
Sockets WSAAsyncGetServByPort function gets service information
corresponding to a port and protocolasynchronous version.
HANDLE WSAAsyncGetServByPort (
HWND hWnd, |
|
unsigned int wMsg, |
|
int port, |
|
const char
FAR * proto, |
|
char FAR *
buf, |
|
int buflen |
|
); |
|
Parameters
hWnd
[in] The
handle of the window which should receive a message when the asynchronous
request completes.
wMsg
[in] The
message to be received when the asynchronous request completes.
port
[in] The port
for the service, in network byte order.
proto
[in] A
pointer to a protocol name. This can be NULL, in which case WSAAsyncGetServByPort
will search for the first service entry for which s_port match the given
port. Otherwise, WSAAsyncGetServByPort matches both port
and proto.
buf
[out] A
pointer to the data area to receive the servent data. Note that this must be
larger than the size of a servent structure. This is because the data area
supplied is used by Windows Sockets to contain not only a servent structure but
any and all of the data which is referenced by members of the servent
structure. It is recommended that you supply a buffer of MAXGETHOSTSTRUCT
bytes.
buflen
[in] The size
of data area buf above.
Remarks
This function
is an asynchronous version of getservbyport, and is used to retrieve
service information corresponding to a port number. Windows Sockets initiates
the operation and returns to the caller immediately, passing back an opaque
"asynchronous task handle" which the application can use to identify
the operation. When the operation is completed, the results (if any) are copied
into the buffer provided by the caller and a message is sent to the application's
window.
When the
asynchronous operation is complete the application's window hWnd
receives message wMsg. The wParam argument contains the
asynchronous task handle as returned by the original function call. The high 16
bits of lParam contain any error code. The error code can be any error
as defined in WINSOCK2.H. An error code of zero indicates successful completion
of the asynchronous operation. On successful completion, the buffer supplied to
the original function call contains a servent structure. To access the elements
of this structure, the original buffer address should be cast to a servent
structure pointer and accessed as appropriate.
Note that if
the error code is WSAENOBUFS, it indicates that the size of the buffer
specified by buflen in the original call was too small to contain all
the resultant information. In this case, the low 16 bits of lParam
contain the size of buffer required to supply ALL the requisite information. If
the application decides that the partial data is inadequate, it can reissue the
WSAAsyncGetServByPort function call with a buffer large enough to
receive all the desired information (that is, no smaller than the low 16 bits
of lParam).
The error
code and buffer length should be extracted from the lParam using the
macros WSAGETASYNCERROR and WSAGETASYNCBUFLEN, defined in WINSOCK2.H as:
#define WSAGETASYNCERROR(lParam) HIWORD(lParam)
#define WSAGETASYNCBUFLEN(lParam) LOWORD(lParam)
The use of
these macros will maximize the portability of the source code for the
application.
Return Values
The return
value specifies whether or not the asynchronous operation was successfully
initiated. Note that it does not imply success or failure of the operation
itself.
If the
operation was successfully initiated, WSAAsyncGetServByPort returns a
nonzero value of type HANDLE which is the asynchronous task handle for the
request (not to be confused with a Windows HTASK). This value can be used in
two ways. It can be used to cancel the operation using WSACancelAsyncRequest.
It can also be used to match up asynchronous operations and completion
messages, by examining the wParam message argument.
If the
asynchronous operation could not be initiated, WSAAsyncGetServByPort
returns a zero value, and a specific error number can be retrieved by calling WSAGetLastError.
Comments
The buffer
supplied to this function is used by Windows Sockets to construct a servent
structure together with the contents of data areas referenced by members of the
same servent structure. To avoid the WSAENOBUFS error noted above, the
application should provide a buffer of at least MAXGETHOSTSTRUCT bytes (as
defined in WINSOCK2.H).
Error Codes
The following
error codes can be set when an application window receives a message. As
described above, they can be extracted from the lParam in the reply
message using the WSAGETASYNCERROR macro.
WSAENETDOWN |
The network
subsystem has failed. |
WSAENOBUFS |
Insufficient
buffer space is available. |
WSAEFAULT |
proto or buf is not in a valid part of the process
address space. |
WSAHOST_NOT_FOUND |
Authoritative
Answer Port not found. |
WSATRY_AGAIN |
Non-Authoritative
Port not found, or server failure. |
WSANO_RECOVERY |
Nonrecoverable
errors, the services database is not accessible. |
WSANO_DATA |
Valid name,
no data record of requested type. |
The following
errors can occur at the time of the function call, and indicate that the
asynchronous operation could not be initiated.
WSANOTINITIALISED |
A
successful WSAStartup must occur before using this function. |
WSAENETDOWN |
The network
subsystem has failed. |
WSAEINPROGRESS |
A blocking
Windows Sockets 1.1 call is in progress, or the service provider is still
processing a callback function. |
WSAEWOULDBLOCK |
The
asynchronous operation cannot be scheduled at this time due to resource or
other constraints within the Windows Sockets implementation. |
See Also