📄 enumprotocalview.cpp
字号:
// EnumProtocalView.cpp : implementation of the CEnumProtocalView class
//
#include "stdafx.h"
#include "EnumProtocal.h"
#include "EnumProtocalDoc.h"
#include "EnumProtocalView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CEnumProtocalView
IMPLEMENT_DYNCREATE(CEnumProtocalView, CTreeView)
BEGIN_MESSAGE_MAP(CEnumProtocalView, CTreeView)
//{{AFX_MSG_MAP(CEnumProtocalView)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CTreeView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CTreeView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CTreeView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CEnumProtocalView construction/destruction
CEnumProtocalView::CEnumProtocalView()
{
WSACleanup();
}
CEnumProtocalView::~CEnumProtocalView()
{
}
BOOL CEnumProtocalView::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style |= TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_EDITLABELS;
return CTreeView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CEnumProtocalView drawing
void CEnumProtocalView::OnDraw(CDC* pDC)
{
CEnumProtocalDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
void CEnumProtocalView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
WSADATA wsa;
WSAStartup(MAKEWORD(2,2),&wsa);
AddAllProtocals();
// TODO: You may populate your TreeView with items by directly accessing
// its tree control through a call to GetTreeCtrl().
}
/////////////////////////////////////////////////////////////////////////////
// CEnumProtocalView printing
BOOL CEnumProtocalView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CEnumProtocalView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CEnumProtocalView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CEnumProtocalView diagnostics
#ifdef _DEBUG
void CEnumProtocalView::AssertValid() const
{
CTreeView::AssertValid();
}
void CEnumProtocalView::Dump(CDumpContext& dc) const
{
CTreeView::Dump(dc);
}
CEnumProtocalDoc* CEnumProtocalView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CEnumProtocalDoc)));
return (CEnumProtocalDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CEnumProtocalView message handlers
LPCTSTR CEnumProtocalView::GetProtoDesc(int iProtocol)
{
// WINSOCK2.H
switch(iProtocol)
{
case IPPROTO_IP:
return "IPPROTO_IP";
case IPPROTO_ICMP:
return "IPPROTO_ICMP";
case IPPROTO_IGMP:
return "IPPROTO_IGMP";
case IPPROTO_GGP:
return "IPPROTO_GGP";
case IPPROTO_TCP:
return "IPPROTO_TCP";
case IPPROTO_PUP:
return "IPPROTO_PUP";
case IPPROTO_UDP:
return "IPPROTO_UDP";
case IPPROTO_IDP:
return "IPPROTO_IDP";
case IPPROTO_ND:
return "IPPROTO_ND";
case IPPROTO_RAW:
return "IPPROTO_RAW";
// Novell - WSIPX.H
case NSPROTO_IPX:
return "NSPROTO_IPX";
case NSPROTO_SPX:
return "NSPROTO_SPX";
case NSPROTO_SPXII:
return "NSPROTO_SPXII";
//DecNet - WS2DNET.H
case ISOPROTO_TP_CONS:
return "ISOPROTO_TP_CONS";
case ISOPROTO_TP4_CLNS:
return "ISOPROTO_TP4_CLNS";
case ISOPROTO_CLTP_CLNS:
return "ISOPROTO_CLTP_CLNS";
case ISOPROTO_X25:
return "ISOPROTO_X25";
// ATM - WS2ATM.H
case ATMPROTO_AAL5:
return "ATMPROTO_AAL5";
// RSVP - WS2RSVP.H
case IPPROTO_RSVP:
return "IPPROTO_RSVP";
default:
return("Unknown Protocol Description");
}
}
void CEnumProtocalView::AddAllProtocals()
{
LPBYTE pBuf; //保存网络协议信息的缓冲区
DWORD dwLen; //缓冲区的长度
LPWSAPROTOCOL_INFO pInfo;
HTREEITEM hParent;
HTREEITEM hParent2;
HTREEITEM hParent3;
//通过第一次调用WSAEnumProtocols以获得所需缓冲区的大小
dwLen = 0;
int nRet = WSAEnumProtocols(NULL,
NULL, //指定WSAPROTOCOL_INFO结构为空
&dwLen);
if (nRet == SOCKET_ERROR)
{
// 调用失败
if (WSAGetLastError() != WSAENOBUFS)
{
CString strTemp;
strTemp.Format("EnumProtocals() failed:%d",WSAGetLastError());
AfxMessageBox(strTemp);
return;
}
}
//检查缓冲区的大小是否可以容纳信息
if (dwLen < sizeof(WSAPROTOCOL_INFO))
{
AfxMessageBox("Internal error");
return;
}
dwLen++;
pBuf = (LPBYTE) malloc(dwLen); //申请所需的内存
if (pBuf == NULL)
{
AfxMessageBox("Couldn't allocate protocol buffer");
return;
}
//进行第二次实际的调用,nRet返回协议的个数
nRet = WSAEnumProtocols(NULL,
(LPWSAPROTOCOL_INFO)pBuf,
&dwLen);
if (nRet == SOCKET_ERROR)
{
//调用失败
free(pBuf);
CString strTemp;
strTemp.Format("EnumProtocals() failed:%d",WSAGetLastError());
AfxMessageBox(strTemp);
return;
}
//遍历各协议的信息,把不同层次的协议信息加到树形视图中
pInfo = (LPWSAPROTOCOL_INFO)pBuf;
for(int nCount = 0; nCount < nRet; nCount++)
{
// 每个协议从根开始添加
hParent = AddTreeItem(GetTreeCtrl().m_hWnd,
TVI_ROOT,
pInfo->szProtocol);
// 接着添加该协议所支持的特性
hParent2 = AddTreeItem(GetTreeCtrl().m_hWnd,
hParent,
"Service Flags");
//定义宏以便添加协议支持的特性
#define ADDSF(f, s1, s2) \
AddTreeItem(GetTreeCtrl().m_hWnd, \
hParent2, \
(pInfo->dwServiceFlags1 & f) ? \
s1 : s2)
//提供无连接服务
ADDSF(XP1_CONNECTIONLESS,
"Connectionless",
"Connection-oriented");
//保证发送出去的所有数据都将到达既定接收端
ADDSF(XP1_GUARANTEED_DELIVERY,
"Delivery guaranteed",
"Delivery NOT guaranteed");
//保证数据按其发送顺序到达接收端,且数据不会重复
ADDSF(XP1_GUARANTEED_ORDER,
"Order guaranteed",
"Order NOT guaranteed");
//实现消息边界
ADDSF(XP1_MESSAGE_ORIENTED,
"Message boundaries preserved",
"Message boundaries NOT preserved");
if (pInfo->dwServiceFlags1 & XP1_PSEUDO_STREAM)
AddTreeItem(GetTreeCtrl().m_hWnd, hParent2,
"Message oriented with boundaries ignored");
//支持支持二相关闭
ADDSF(XP1_GRACEFUL_CLOSE,
"Can perform graceful close",
"Abortive close only");
//该协议提供带外数据
ADDSF(XP1_EXPEDITED_DATA,
"Supports expedited data",
"Doesn't support expedited data");
//支持面向连接服务
ADDSF(XP1_CONNECT_DATA,
"Supplies connect data",
"Doesn't supply connect data");
ADDSF(XP1_DISCONNECT_DATA,
"Supplies disconnect data",
"Doesn't supply disconnect data");
//支持广播
ADDSF(XP1_SUPPORT_BROADCAST,
"Supports broadcasts",
"Doesn't support broadcasts");
// 支持多播
if (pInfo->dwServiceFlags1 & XP1_SUPPORT_MULTIPOINT)
{
hParent3 = AddTreeItem(GetTreeCtrl().m_hWnd,
hParent2,
"Supports multicast");
//支持多播特性包括两个方面:可以打开控制面板或不可以
AddTreeItem(GetTreeCtrl().m_hWnd,
hParent3,
(pInfo->dwServiceFlags1 &
XP1_MULTIPOINT_CONTROL_PLANE) ?
"Control plane rooted" :
"Control plane non-rooted");
AddTreeItem(GetTreeCtrl().m_hWnd,
hParent3,
(pInfo->dwServiceFlags1 &
XP1_MULTIPOINT_DATA_PLANE) ?
"Data plane rooted" :
"Data plane non-rooted");
}
else
AddTreeItem(GetTreeCtrl().m_hWnd,
hParent2,
"Doesn't support multicast");
//支持服务质量控制
ADDSF(XP1_QOS_SUPPORTED,
"Supports quality of service",
"Doesn't support quality of service");
//单向发送
if (pInfo->dwServiceFlags1 & XP1_UNI_SEND)
AddTreeItem(GetTreeCtrl().m_hWnd,
hParent2,
"Unidirectional in the send direction");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -