Winsock编程-WSAEnumProtocols()

来源:互联网 发布:淘宝会员通 编辑:程序博客网 时间:2024/05/16 01:38

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;
 intnRet=WSAEnumProtocols(NULL,NULL,&dwLen);
 if(nRet==SOCKET_ERROR)
 {
  if (WSAGetLastError() !=WSAENOBUFS)
  printf("Get dwLenerror!/n");
 }
 
 printf("缓冲区的大小:%d/n",dwLen);
 dwLen++;
 pBuf=(LPBYTE)malloc(dwLen);
 if(pBuf==NULL)
 {printf("Allocate protool buffer error/n");return1;}
 nRet=WSAEnumProtocols(NULL,(LPWSAPROTOCOL_INFO)pBuf,&dwLen);
  if(nRet==SOCKET_ERROR)
  {printf("EnumProtocols failed!/n");}

 pInfo=(LPWSAPROTOCOL_INFO)pBuf;
 for(intnCount=0;nCount<nRet;nCount++)
 {
  printf("%s/n",pInfo->szProtocol );
 pInfo++;
 }
  free(pBuf);
 WSACleanup();
 return 0;
}

原创粉丝点击