獲取網(wǎng)絡(luò)協(xié)議的步驟和代碼
對于已經(jīng)安裝過的網(wǎng)絡(luò)協(xié)議來說,我們可通過C++的使用來進行獲取網(wǎng)絡(luò)協(xié)議的工作。那么具體的操作步驟,以及相關(guān)的代碼我們在下文中進行了介紹和講解,步驟比較細致,那么本文的總結(jié),望對大家有所幫助。
一、創(chuàng)建對話框應(yīng)用程序
二、編輯對話框資源
控件ID及標題
- IDC_LIST_PROTOCOLS
- IDC_GETNETPROTOCOLS 獲取網(wǎng)絡(luò)協(xié)議
- IDOK 確認
- IDCANCEL 取消
#p#
三、添加變量、函數(shù)
1、添加變量
2、添加函數(shù)
#p#
四、添加代碼
五、添加對象/庫模塊
1、 于“GetNetProtocolsDlg.cpp”文件內(nèi)添加包含語句
- #include "stdafx.h"
- #include "GetNetProtocols.h"
- #include "GetNetProtocolsDlg.h"
- #include <winsock2.h>
2、添加獲取網(wǎng)絡(luò)協(xié)議的函數(shù)代碼
- 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獲得計算機安裝的協(xié)議
- // 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("該計算機安裝的網(wǎng)絡(luò)協(xié)議有:");
- m_ListProtocols.AddString(strTemp);
- for (i=0; i<nRet; i++)
- {
- strTemp.Format(" 協(xié)議%d:<%s>\r",i+1, lpProtocolBuf[i].szProtocol);
- m_ListProtocols.AddString(strTemp);
- }
- }
- free(lpProtocolBuf);
- }//if (lpProtocolBuf)結(jié)束
- }//第二層else結(jié)束
- }//第一層else結(jié)束
- //調(diào)用WSACleanup函數(shù)進行WinSock的清理工作,以便釋放其占用的資源
- WSACleanup();
- }
點“工程”,點“設(shè)置”,點選“連接”,添加“Ws2_32.lib ”模塊。
六、編譯
七、運行
#p#
八、函數(shù)說明:
1、WSAStartup函數(shù)聲明
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData)
wVersionRequested:為將要使用之Windows Stockets API版本,是一高位為次版本號,低位為主版本號的WORD類型整數(shù)。
lpWSAData:指向WSADATA資料之指針。
功能:完成windows Sockets之一系列初始化,乃使用windows Sockets之應(yīng)用程序都必須調(diào)用的函數(shù)。該函數(shù)調(diào)用成功,返回“0”,可以使用Sockets;失敗則返回錯誤值,使用不了Sockets。
2、WSAEnumProtocols函數(shù)聲明
int WSAEnumProtocols(LPINT lpiProtocols,LPWSAPROTOCOL_INFO lpProtocolBuffer,LPDWORD lpdwBufferLength)
lpiProtocols:一個以NULL結(jié)尾的協(xié)議標識號數(shù)組,為可選參數(shù)。lpdwProtocols為NULL時返回所有可用協(xié)議信息;否則返回數(shù)組所列協(xié)議信息。
lpProtocolBuffer:以結(jié)構(gòu)WSAPROTOCOL_INFO填充之緩沖區(qū)。WSAPROTOCOL_INFO結(jié)構(gòu)用于存取一給定協(xié)議之完整信息。
lpdwBufferLength:輸入時,用于存放傳遞給WSAEnumProtocols()函數(shù)之lpProtocolBuffer緩沖區(qū)長度;輸出時,為所有獲取網(wǎng)絡(luò)協(xié)議的信息需傳遞于WSAEnumProtocols()函數(shù)之緩沖區(qū)長度。
功能:獲取網(wǎng)絡(luò)協(xié)議安裝于本地PC機上的可用網(wǎng)絡(luò)協(xié)議族,成功則返回協(xié)議數(shù)目,失敗則返回錯誤值。
3、WSAPROTOCOL_INFO結(jié)構(gòu)定義
- 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:表示不同協(xié)議屬性之一個位字段。
szProtocol:指向網(wǎng)絡(luò)協(xié)議族,由此參數(shù)獲取網(wǎng)絡(luò)協(xié)議。
功能:存放和獲取一給定協(xié)議的完整信息。