Winsock编程-WSAEnumProtocols()

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值