獲取網絡協議的步驟和代碼
對于已經安裝過的網絡協議來說,我們可通過C++的使用來進行獲取網絡協議的工作。那么具體的操作步驟,以及相關的代碼我們在下文中進行了介紹和講解,步驟比較細致,那么本文的總結,望對大家有所幫助。
一、創建對話框應用程序

二、編輯對話框資源
控件ID及標題
- IDC_LIST_PROTOCOLS
- IDC_GETNETPROTOCOLS 獲取網絡協議
- IDOK 確認
- IDCANCEL 取消
#p#
三、添加變量、函數
1、添加變量

2、添加函數
#p#
四、添加代碼
五、添加對象/庫模塊
1、 于“GetNetProtocolsDlg.cpp”文件內添加包含語句
- #include "stdafx.h"
- #include "GetNetProtocols.h"
- #include "GetNetProtocolsDlg.h"
- #include <winsock2.h>
2、添加獲取網絡協議的函數代碼
- void CGetNetProtocolsDlg::OnGetnetprotocols()
- {
- // TODO: Add your control notification handler code here
- WSADATA WSAData;
- int i, nRet;
- DWORD dwErr;
- WSAPROTOCOL_INFO *lpProtocolBuf = NULL;
- DWORD dwBufLen = 0;
- CString strTemp;
- if (WSAStartup(MAKEWORD(2,2), &WSAData))
- {
- strTemp.Format("WSAStartup %d", WSAGetLastError());
- m_ListProtocols.AddString(strTemp);
- }
- else//第一層
- {
- //方法:WSAEnumProtocols獲得計算機安裝的協議
- // First, have WSAEnumProtocols tell you how big a buffer you need.
- nRet = WSAEnumProtocols(NULL, lpProtocolBuf, &dwBufLen);
- if (SOCKET_ERROR != nRet)
- {
- strTemp.Format("WSAEnumProtocols: should not have succeeded\r\n");
- m_ListProtocols.AddString(strTemp);
- }
- else if (WSAENOBUFS != (dwErr = WSAGetLastError()))
- {
- // WSAEnumProtocols failed for some reason not relating to buffer size - also odd.
- strTemp.Format("WSAEnumProtocols(1): %d\r\n", WSAGetLastError());
- m_ListProtocols.AddString(strTemp);
- }
- else//第二層
- {
- // WSAEnumProtocols failed for the "expected" reason.
- // Now you need to allocate a buffer that is the right size.
- lpProtocolBuf = (WSAPROTOCOL_INFO *)malloc(dwBufLen);
- if (lpProtocolBuf)
- {
- // Now you can call WSAEnumProtocols again with the
- // expectation that it will succeed
- // because you have allocated a big enough buffer.
- nRet = WSAEnumProtocols(NULL, lpProtocolBuf, &dwBufLen);
- if (SOCKET_ERROR == nRet)
- {
- strTemp.Format("WSAEnumProtocols(3): %d\r\n", WSAGetLastError());
- m_ListProtocols.AddString(strTemp);
- }
- else
- {
- // Enumerate the protocols.
- strTemp.Format("該計算機安裝的網絡協議有:");
- m_ListProtocols.AddString(strTemp);
- for (i=0; i<nRet; i++)
- {
- strTemp.Format(" 協議%d:<%s>\r",i+1, lpProtocolBuf[i].szProtocol);
- m_ListProtocols.AddString(strTemp);
- }
- }
- free(lpProtocolBuf);
- }//if (lpProtocolBuf)結束
- }//第二層else結束
- }//第一層else結束
- //調用WSACleanup函數進行WinSock的清理工作,以便釋放其占用的資源
- WSACleanup();
- }
點“工程”,點“設置”,點選“連接”,添加“Ws2_32.lib ”模塊。

六、編譯
七、運行
#p#
八、函數說明:
1、WSAStartup函數聲明
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData)
wVersionRequested:為將要使用之Windows Stockets API版本,是一高位為次版本號,低位為主版本號的WORD類型整數。
lpWSAData:指向WSADATA資料之指針。
功能:完成windows Sockets之一系列初始化,乃使用windows Sockets之應用程序都必須調用的函數。該函數調用成功,返回“0”,可以使用Sockets;失敗則返回錯誤值,使用不了Sockets。
2、WSAEnumProtocols函數聲明
int WSAEnumProtocols(LPINT lpiProtocols,LPWSAPROTOCOL_INFO lpProtocolBuffer,LPDWORD lpdwBufferLength)
lpiProtocols:一個以NULL結尾的協議標識號數組,為可選參數。lpdwProtocols為NULL時返回所有可用協議信息;否則返回數組所列協議信息。
lpProtocolBuffer:以結構WSAPROTOCOL_INFO填充之緩沖區。WSAPROTOCOL_INFO結構用于存取一給定協議之完整信息。
lpdwBufferLength:輸入時,用于存放傳遞給WSAEnumProtocols()函數之lpProtocolBuffer緩沖區長度;輸出時,為所有獲取網絡協議的信息需傳遞于WSAEnumProtocols()函數之緩沖區長度。
功能:獲取網絡協議安裝于本地PC機上的可用網絡協議族,成功則返回協議數目,失敗則返回錯誤值。
3、WSAPROTOCOL_INFO結構定義
- typedef struct_WSAPROTOCOL_INFO{
- DWORD dwServiceFlags1;
- DWORD dwServiceFlags2;
- DWORD dwServiceFlags3;
- DWORD dwServiceFlags4;
- DWORD dwServiceFlags;
- GUID ProviderId;
- DWORD dwCatalogEntryId;
- WSAPROTOCOLCHAIN ProtocolChain;
- int iVersion;
- int iAddressFamily;
- int iMaxSockAddr;
- int iMinSocAddr;
- int iSocketType;
- int iProtocl;
- int iProtoclMaxOffset;
- int iNetworkByteOrder;
- int iSecurityScheme;
- DWORD dwMessageSi;
- DWORD dwProviderReserved;
- TCHAR szProtocol[WSAPROTOCOL_LEN+1];
- }WSAPROTOCOL_INFO,*LPWSAPROTOCOL_INFO
dwServiceFlags1:表示不同協議屬性之一個位字段。
szProtocol:指向網絡協議族,由此參數獲取網絡協議。
功能:存放和獲取一給定協議的完整信息。




















