EnumProtocols
Important The EnumProtocols
function is a Microsoft-specific extension to the Windows Sockets 1.1
specification. This function is obsolete. For the convenience of Windows
Sockets 1.1 developers, the reference material is below.
In Windows
Sockets 2, this functionality is realized with the function WSAEnumProtocols
The EnumProtocols
function obtains information about a specified set of
network
protocols that are active on a local host.
INT EnumProtocols(
LPINT lpiProtocols, |
// pointer to array
of protocol identifiers |
LPVOID lpProtocolBuffer, |
// pointer to
buffer to receive protocol information |
LPDWORD lpdwBufferLength |
// pointer to
variable that specifies the size of the receiving buffer |
); |
|
Parameters
lpiProtocols
Pointer to a
null-terminated array of protocol identifiers. The EnumProtocols function
obtains information about the protocols specified by this array.
If lpiProtocols
is NULL, the function obtains information about all available protocols.
The following
protocol identifier values are defined:
Value |
Protocol |
IPPROTO_TCP |
TCP/IP, a
connection/stream-oriented protocol |
IPPROTO_UDP |
User
Datagram Protocol (UDP/IP), a connectionless datagram protocol |
ISOPROTO_TP4 |
ISO
connection-oriented transport protocol |
NSPROTO_IPX |
IPX |
NSPROTO_SPX |
SPX |
NSPROTO_SPXII |
SPX II |
lpProtocolBuffer
Pointer to a
buffer that the function fills with an array of PROTOCOL_INFO
lpdwBufferLength
Pointer to a
variable that, on input, specifies the size, in bytes, of the buffer pointed to
by lpProtocolBuffer.
On output,
the function sets this variable to the minimum buffer size needed to retrieve
all of the requested information. For the function to succeed, the buffer must
be at least this size.
Return Values
If the function
succeeds, the return value is the number of PROTOCOL_INFO data
structures written to the buffer pointed to by lpProtocolBuffer.
If the
function fails, the return value is SOCKET_ERROR ( - 1). To get extended error information, call GetLastError
Value |
Meaning |
ERROR_INSUFFICIENT_BUFFER |
The buffer
pointed to by lpProtocolBuffer was too small to receive all of the
relevant PROTOCOL_INFO |
Remarks
In the
following sample code, the EnumProtocols function obtains information
about all protocols that are available on a system. The code then examines each
of the protocols in greater detail.
SOCKET
OpenConnection (
PTSTR
ServiceName,
PGUID
ServiceType,
BOOL
Reliable,
BOOL
MessageOriented,
BOOL
StreamOriented,
BOOL
Connectionless,
PINT
ProtocolUsed
)
{
// local
variables
INT
protocols[MAX_PROTOCOLS+1];
BYTE
buffer[2048];
DWORD
bytesRequired;
INT err;
PPROTOCOL_INFO protocolInfo;
PCSADDR_INFO csaddrInfo;
INT
protocolCount;
INT
addressCount;
INT i;
DWORD
protocolIndex;
SOCKET s;
// First
look up the protocols installed on this machine.
//
bytesRequired = sizeof(buffer);
err =
EnumProtocols( NULL, buffer, &bytesRequired );
if ( err
<= 0 )
return
INVALID_SOCKET;
// Walk
through the available protocols and pick out the ones which
// support
the desired characteristics.
//
protocolCount = err;
protocolInfo = (PPROTOCOL_INFO)buffer;
for ( i =
0, protocolIndex = 0;
i <
protocolCount && protocolIndex < MAX_PROTOCOLS;
i++,
protocolInfo++ ) {
// If
connection-oriented support is requested, then check if
//
supported by this protocol. We assume
here that connection-
//
oriented support implies fully reliable service.
//
if (
Reliable ) {
//
Check to see if the protocol is reliable.
It must
//
guarantee both delivery of all data and the order in
//
which the data arrives.
//
if
( (protocolInfo->dwServiceFlags &
XP_GUARANTEED_DELIVERY) == 0
||
(protocolInfo->dwServiceFlags &
XP_GUARANTEED_ORDER) == 0 ) {
continue;
}
//
Check to see that the protocol matches the stream/message
//
characteristics requested.
//
if
( StreamOriented &&
(protocolInfo->dwServiceFlags & XP_MESSAGE_ORIENTED)
!= 0 &&
(protocolInfo->dwServiceFlags
& XP_PSEUDO_STREAM)
== 0 ) {
continue;
}
if
( MessageOriented &&
(protocolInfo->dwServiceFlags &
XP_MESSAGE_ORIENTED)
== 0 ) {
continue;
}
}
else
if ( Connectionless ) {
//
Make sure that this is a connectionless protocol.
//
if
( (protocolInfo->dwServiceFlags & XP_CONNECTIONLESS)
!= 0 )
continue;
}
//
This protocol fits all the criteria. Add
it to the list of
//
protocols in which we're interested.
//
protocols[protocolIndex++] = protocolInfo->iProtocol;
}
See Also