- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
<分区>
MFC 应用程序在向列表控件中添加元素时卡住,无法单击任何其他按钮,甚至无法在嗅探网络数据包时关闭按钮。
整个代码如下所示:
// SnifferSampleDlg.cpp : implementation file
//
#include "stdafx.h"
#include "SnifferSample.h"
#include "SnifferSampleDlg.h"
#include "afxdialogex.h"
#include <Windows.h>
#include <WinSock2.h>
#include <mstcpip.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#pragma comment(lib,"ws2_32.lib") //For winsock
// CSnifferSampleDlg dialog
//typedef struct ip_hdr
//{
// unsigned char ip_header_len:4; // 4-bit header length (in 32-bit words) normally=5 (Means 20 Bytes`enter code here` may be 24 also)
// unsigned char ip_version :4; // 4-bit IPv4 version
// unsigned char ip_tos; // IP type of service
// unsigned short ip_total_length; // Total length
// unsigned short ip_id; // Unique identifier
//
// unsigned char ip_frag_offset :5; // Fragment offset field
//
// unsigned char ip_more_fragment :1;
// unsigned char ip_dont_fragment :1;
// unsigned char ip_reserved_zero :1;
//
// unsigned char ip_frag_offset1; //fragment offset
//
// unsigned char ip_ttl; // Time to live
// unsigned char ip_protocol; // Protocol(TCP,UDP etc)
// unsigned short ip_checksum; // IP checksum
// unsigned int ip_srcaddr; // Source address
// unsigned int ip_destaddr; //destination address
//} IPV4_HDR;
typedef struct tcp_header
{
unsigned short source_port; // source port
unsigned short dest_port; // destination port
unsigned int sequence; // sequence number - 32 bits
unsigned int acknowledge; // acknowledgement number - 32 bits
unsigned char ns :1; //Nonce Sum Flag Added in RFC 3540.
unsigned char reserved_part1:3; //according to rfc
unsigned char data_offset:4; /*The number of 32-bit words in the TCP header.
This indicates where the data begins.
The length of the TCP header is always a multiple
of 32 bits.*/
unsigned char fin :1; //Finish Flag
unsigned char syn :1; //Synchronise Flag
unsigned char rst :1; //Reset Flag
unsigned char psh :1; //Push Flag
unsigned char ack :1; //Acknowledgement Flag
unsigned char urg :1; //Urgent Flag
unsigned char ecn :1; //ECN-Echo Flag
unsigned char cwr :1; //Congestion Window Reduced Flag
////////////////////////////////
unsigned short window; // window
unsigned short checksum; // checksum
unsigned short urgent_pointer; // urgent pointer
} TCP_HDR;
int total = 0,icmp = 0, igmp = 0,tcp = 0 ,udp = 0 ,others = 0;
CSnifferSampleDlg::CSnifferSampleDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CSnifferSampleDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CSnifferSampleDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, m_listCtrl);
}
BEGIN_MESSAGE_MAP(CSnifferSampleDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &CSnifferSampleDlg::OnBnClickedButton1)
END_MESSAGE_MAP()
// CSnifferSampleDlg message handlers
static void AddData(CListCtrl &ctrl, int row, int col, LPWSTR str)
{
LVITEM lv;
lv.iItem = row;
lv.iSubItem = col;
lv.pszText = str;
lv.mask = LVIF_TEXT;
if(col == 0)
ctrl.InsertItem(0,str);
/*ctrl.RedrawItems( 0, tcp);*/
else
ctrl.SetItem(&lv);
}
BOOL CSnifferSampleDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
m_listCtrl.InsertColumn(0, L"Source");
m_listCtrl.SetColumnWidth(0, 100);
m_listCtrl.InsertColumn(1,L"Destination");
m_listCtrl.SetColumnWidth(1, 100);
m_listCtrl.InsertColumn(2, L"Protocol");
m_listCtrl.SetColumnWidth(2, 90);
m_listCtrl.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0,
LVS_EX_FULLROWSELECT);
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CSnifferSampleDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
// The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CSnifferSampleDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
int CSnifferSampleDlg::Startbutton()
{
SOCKET ListenSocket;
struct sockaddr_in saServer;
hostent* localHost;
char* localIP;
WSADATA wsaData;
int iResult;
tcp=0;
//Initialising Winsock....
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0)
{
AfxMessageBox(L"WSAStartup() failed");
return 1;
}
//Creating RAW socket for listening
ListenSocket = socket (AF_INET,SOCK_RAW,IPPROTO_IP);
localHost = gethostbyname("");
localIP = inet_ntoa (*(struct in_addr *)*localHost->h_addr_list);
saServer.sin_family = AF_INET;
saServer.sin_addr.s_addr = inet_addr(localIP);
saServer.sin_port = htons(5150);
// Bind the listening socket using the
// information in the sockaddr structure
iResult = bind( ListenSocket,(SOCKADDR*) &saServer, sizeof(saServer) );
if( iResult != 0){
AfxMessageBox(L"Binding the address with the socket failed ");
return 1;
}
AfxMessageBox(L"Binding successful");
int in_buffer=1, out_buffer;
if (WSAIoctl(ListenSocket,SIO_RCVALL, &in_buffer,sizeof(in_buffer), 0, 0,(LPDWORD) &out_buffer , 0 , 0) == SOCKET_ERROR)
{
AfxMessageBox(L"WSAIoctl() failed...");
return 1;
}
AfxMessageBox(L"Socket Set");
CString strText;
int nColumnCount = m_listCtrl.GetHeaderCtrl()->GetItemCount();
StartSniffing(ListenSocket);
closesocket(ListenSocket);
WSACleanup();
return 0;
}
void CSnifferSampleDlg::StartSniffing(SOCKET sniffer){
char *Buffer = (char *)malloc(65536);
int mangobyte;
if (Buffer == NULL)
{
printf("malloc() failed.\n");
return;
}
do
{
mangobyte = recvfrom(sniffer , Buffer , 65536 , 0 , 0 , 0);
if(mangobyte > 0)
{
ProcessPacket(Buffer,mangobyte);
/*if(tcp==50)
break;*/
}
else
{
printf( "recvfrom() failed.\n");
}
}
while (mangobyte > 0);
free(Buffer);
}
void CSnifferSampleDlg::ProcessPacket(char* buffer,int size){
ip.ValueAssign(buffer);
++total;
//Check the Protocol and do accordingly...
switch (ip.ip_protocol)
{
case 1: //ICMP Protocol
++icmp;
break;
case 2: //IGMP Protocol
++igmp;
break;
case 6: //TCP Protocol
++tcp;
ProcessTCPPacket(buffer,size);
/*if(tcp==50)
break;*/
break;
case 17: //UDP Protocol
++udp;
break;
default: //Some Other Protocol like ARP etc.
++others;
break;
}
printf("TCP : %d UDP : %d ICMP : %d IGMP : %d Others : %d Total : %d\r",tcp,udp,icmp,igmp,others,total);
}
void CSnifferSampleDlg::ProcessTCPPacket(char* buffer,int size){
unsigned short iphdrlen;
SOCKADDR_IN source;
char* source_addr;
char* destination_addr;
source.sin_addr.s_addr = ip.ip_srcaddr;
source_addr=inet_ntoa(source.sin_addr);
SOCKADDR_IN destination;
wchar_t source_address[20];
wchar_t destination_address[20];
mbstowcs_s(0,source_address,source_addr,strlen(source_addr)+1); //method used to convert char* to LPWSTR
destination.sin_addr.s_addr = ip.ip_destaddr;
destination_addr=inet_ntoa(destination.sin_addr);
mbstowcs_s(0,destination_address,destination_addr,strlen(destination_addr)+1);
m_listCtrl.InsertColumn(3,L"");
m_listCtrl.SetColumnWidth(3, 80);
m_listCtrl.SetRedraw(FALSE);
AddData(m_listCtrl,0,0,source_address);
/*AddData(m_listCtrl,0,1,destination_address);
AddData(m_listCtrl,0,2,L"TCP");*/
m_listCtrl.SetRedraw(TRUE);
m_listCtrl.DeleteColumn(3);
}
void CSnifferSampleDlg::OnBnClickedButton1()
{
Startbutton();
}
即使我使用线程,它也无法正常工作。
数据包嗅探实际上是一个持续的过程,直到按下停止按钮。但是在这个程序中,当嗅探完成后,无法按下其他按钮,应用程序就会卡住。当我将嗅探限制为 20 或 50 时,那么在那么多数据包之后我们只能做任何其他事情。但是将应用程序限制在 20 或 50 个数据包是一个很大的缺点。
我有一个 MFC 项目,它链接到第三方 dll。在程序退出时,IDE 会报告“检测到内存泄漏!”并倾倒泄漏物。 这些泄漏来自第三方 dll。我很确定这些是错误的报道。 (Google 的快速检查表明
首先我想要的是:能够显示具有多列的网格,每个单元格都有一个自定义渲染回调。因此,您可以使用这样的控件在游戏中显示您的库存,或者类似于 Google Chrome 中的行为,它会显示您访问的热门页面的网
在新的 MFC 功能(功能包)中,菜单出现在三个地方: 在菜单栏中 (CMFCMenuBar) 在弹出菜单中 (CMFCPopupMenu) 在 CMFCButton 的“下拉菜单”版本中 我想在所有
在我的 MFC 项目中,我想动态生成标签。例如:我必须为它们生成 4 个编辑控件和相应的标签——比如“Label1”“Label2”...... CStatic *label[MAX_THREAD];
我有第一个对话框,上面有一个简单的按钮,单击该按钮时,使用 CDialog::Create(IDD,this) 创建了第二个对话框。我希望在销毁第二个对话框但不向第二个对话框添加任何代码时通知父级,即
我们的代码库中的添加到剪贴板代码非常低级 - 分配全局内存等等。对于简单的情况,我只想将一些纯文本放在剪贴板上,是否有任何例程可以包装所有这些内容? 一个例子是 CRichEditCtrl 具有 Co
我对 mfc 中事件和消息之间的区别有点困惑。 他们是一样的吗? 最佳答案 由于您专门询问 MFC,我假设您指的是可以在 MFC 类的属性窗口中定义的事件处理程序和消息处理程序。 在“事件”下,您可以
如何以编程方式检测我的 MFC 应用程序当前是否正在显示模式对话框或属性表?目前我正在使用以下内容,但我觉得该代码也会触发无模式对话框。 bool HasModalDialog(const CWnd*
我有两个按钮: 单选按钮:“十六进制” 按钮:“A” 我想在用户选中“十六进制”按钮时启用“A”(“A”在创建时的状态为“禁用”),我该怎么做?谢谢大家。 最佳答案 您需要使用 CButton 's
通常情况下,窗口的厚度为 4 个像素,可以通过 GetSystemMetrics 方法获取。我可以更改它的值,例如 2 个像素吗? 非常感谢! 最佳答案 简单的回答:不。不适用于特定窗口。 复杂的答案
我需要打开一个从同一个类实例化的对话框两次。当我尝试这个时 CdelmeDlg dlg; dlg.DoModal(); dlg.DoModal(); 第二个调用只打开对话框一瞬间,然后关闭。我敢打赌消
如何通过代码在 mfc 中减少标题栏的窗口? 最佳答案 用: ModifyStyle (WS_CAPTION, 0); // to hide ModifyStyle (0, WS_CAPTION);
我使用 AfxMessageBox 关键字显示消息框。基本的东西。 但是,由于路径的长度,它显示如下: 有什么方法可以阻止它以这种方式自动换行吗? 抱歉,如果这是一个愚蠢的问题。但如果我只有一个句子,
所以,我有一个 MFC 程序的插件。我正在使用鼠标事件 Hook (来自 SetWindowsHookEx)来捕获点击。主机应用程序可以打开任意数量的(可能重叠的)子窗口,但我只想拦截特定子窗口中的点
我正在尝试将图像添加到现有按钮..我在一定程度上做到了这一点,问题是我可以添加一个所有者绘制的图像,但无法添加我想要的确切图像..示例见下文代码 CButton* pBtn= (CButton*)Ge
我想在对话框的标题栏上放置一些控件。一种可能的解决方案是,我只是从对话框中删除标题栏并绘制自己的标题栏。 但是如果我自己画标题栏,标题栏的外观不会根据窗口的主题而改变。而且我也不得不忍受接近、最小化和
我已经使用 MinGW 开发了 WinAPI 应用程序,没有问题。现在,我可以用 MFC 做同样的事情吗? 最佳答案 你不能。 MFC 代表 Microsoft Foundation Classes,
(我正在使用VS ++ 2005) 我在对话框上放置了编辑框控件(ID为ID_edit_box),并为其关联了两个变量(使用处理程序向导):控件(c_editbox)和值(v_editbox)变量。我
我有一个自定义 MFC 对话框 CMyDialog,使用资源编辑器添加了一个类型为 CMyControl 的自定义控件 - 该对话框有一个控件的成员变量并且有 DDX设置。 该控件正在接收绘制消息,并
直到现在,我从未真正需要我正在开发的大型 MFC(如果重要,则为单文档界面)应用程序的 Winapp ExitInstance()。但现在我这样做了,主要是为了清理内存分配、卸载一些 DLL 等。好吧
我是一名优秀的程序员,十分优秀!