WSAEunmProtocols 获取系统上安装的网络协议相关信息。
int WSAEnumProtocols ( LPINT lpiProtocols , LPWSAPROTOCOL_INFO lpProtocolBuffer , ILPDWORD lpdwBufferLength );
lpdwProtocols:一个以NULL结尾的协议标识号数组。本参数可选;如果lpdwProtocols为 NULL,则返回所有可用协议的信息,否则的话只返回数组中所开列的协议信息。
lpProtocolBuffer:一个用PROTOCOL_INFO结构填充的缓冲区。PROTOCOL_INFO结构用来存放或得到一个指定协议的完整信息。
lpdwBufferL ength:输入时,存有传递给WSAEnumProtocols() 函数的lpProtocolBuffer缓冲区长度。输出时,表示为获取所有信息需传递给WSAEnumProtocols()函数的缓冲区长度。本函数 不能重复调用;传入的缓冲区必须足够大以能存放所有的元素。这个规定降低了该函数的复杂度。由于一个机器上装载的协议数目往往是很小的,所以并不会产生问题。
返回值:
若无错误发生,WSAEnumProtocols()返回协议的数目。否则的话,将返回INVALID_SOCKET错误,应用程序可通过WSAGetLastError()来获取相应的错误代码。
通常需要两次调用WSAEnumProtocols()函数以获取特定的协议信息,第一次调用时指定lpdwProtocols为 NULL,调用肯定是失败的,但参数lpdwBufferLength包含了所以协议信息需要的缓冲区长度。我们知道了这个准确长度就可以进行第二次调用 了!
#include "stdafx.h"
#include <malloc.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
int main(int argc, char* argv[])
{
WSADATA wsa;
WSAStartup(MAKEWORD(2,2),&wsa);
DWORD dwLen;
LPBYTE pBuf;
LPWSAPROTOCOL_INFO pInfo;
dwLen=0;
int nRet=WSAEnumProtocols(NULL,NULL,&dwLen);
if(nRet==SOCKET_ERROR)
{
if (WSAGetLastError() != WSAENOBUFS)
printf("Get dwLen error!/n");
}
printf("缓冲区的大小:%d/n",dwLen);
dwLen++;
pBuf=(LPBYTE)malloc(dwLen);
if(pBuf==NULL)
{printf("Allocate protool buffer error/n");return 1;}
nRet=WSAEnumProtocols(NULL,(LPWSAPROTOCOL_INFO)pBuf,&dwLen);
if(nRet==SOCKET_ERROR)
{printf("EnumProtocols failed!/n");}
pInfo=(LPWSAPROTOCOL_INFO)pBuf;
for(int nCount=0;nCount<nRet;nCount++)
{
printf("%s /n",pInfo->szProtocol );
pInfo++;
}
free(pBuf);
WSACleanup();
return 0;
}