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