对于已经安装过的网络协议来说,我们可通过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:指向网络协议族,由此参数获取网络协议。
功能:存放和获取一给定协议的完整信息。