网络嗅探器的设计开发------C++_arp嗅探c++-程序员宅基地

第1章 网络嗅探器的测试与分析

1.1 嗅探器分析

1:基于数据库的用户登录界面

 

在注册的时候,就将用户所注册的信息加载到数据库中(用户的密码为了保正数据的CIA特性,在加入数据库的时候我使用了MD5加密算法,在用户组成的时候,江永输入的密码进行MD5的加密,在数据库中进行遍历遍历操作,找到就能够进入下一个界面,不能进入时系统将根据匹配的结果进行系统提示)

2:进入用户的选择界面,此时只有一个选项(用于数据的截获界面的进入,当用户点击相应的按钮时,将进入项目的主界面---------数据包的捕获截面,此处设计的时候由于时间有限,界面显得比较单调,将用于后续的开发使用,从而实现更强大的更强大的可选功能)

 

3::进入主界面(数据的捕获截面时首先需要选择相应的网卡信息,如果在没有选择网卡的情况下进行数据的捕获卖系统将自动提示-------没有选择网卡信息;当用户选择网卡信息后,可根据捕获所有数据包还是有过滤的捕获一些包【TCP/UDP/IGMP.ICMP】);在信息选择完毕时,按下相应的按钮开始数据的捕获。

  数据不活的结果如下:

1>:没有选择的进行数据包的捕获

 

2>:有限责的进行数据包的捕获(此处用TCP数据包的捕获为例)

   

     在此处出现的小问题是在最开始会出现一些空白行这是实践中没有处理的

 

  

   本次的课题是用socketc开发一个网络嗅探器的程序设计,设计完成对流经本地网卡的所有数据包捕获,分析协议类型,并根据不同的协议类型对数据包进行进一步的分析,包括分析数据包的源IP地址,目的IP地址,源端口号,目的端口号,大小等等。设计完成后经测试能实现预期要求的功能。但是仍然存在不足之处,例如:

  1.由于时间和所学知识有限,只对数据包进行了简单分析,就归类到日志文件中。这样会占用很大的内存空间去存储这些数据。并且只能在日志文件中对其进一步的分析,操作量大。

 2.本文中的嗅探器使用于基于广播包的网络,而对于诸如交换机这类设备,由于它能阻止广播,所以就不能够对子网内其他的机器进行监听。

  3 . 通过本次的课程设计,学会了数据包的抓取得相关环节以及一些设计大的系统函数的使用,这在一定条件下,为以后的编程留下了一定的印象和基础。

  4 . 实现了在vs2012的开发的平台下进行界面化的编程设计,对一些常用的控件有了一定的了解。

  5 . 本次课程设计的最大的锻炼自己的地方在于查阅文档的相关能力,与此同时,在查阅玄关的英语文档时,对自身的英语水平有了一定的提高(学到了很多的专业英语词汇)。

  通过对该课题的研究,让我对嗅探器技术有了进一步的了解,对其在网络中产生的影响有了更深的认识。

 

 

 

 

 

 

 

  录(可选)

附录A 核心程序代码

1>:用户注册界面的实现

头文件:

#pragma once

#include "afxwin.h"

// user_register 对话框

class user_register : public CDialogEx

{

DECLARE_DYNAMIC(user_register)

public:

user_register(CWnd* pParent = NULL);   // 标准构造函数

virtual ~user_register();

// 对话框数据

enum { IDD = IDD_DIALOG1 };

protected:

virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

DECLARE_MESSAGE_MAP()

public:

CEdit user_name;

CEdit user_password;

afx_msg void OnBnClickedButton1();

afx_msg void OnBnClickedButton2();

virtual BOOL PreTranslateMessage(MSG* pMsg);

virtual BOOL OnInitDialog();

};

成员函数的实现:

// user_register.cpp : 实现文件

//

 

#include "stdafx.h"

#include "safe.h"

#include "user_register.h"

#include "afxdialogex.h"

#include "safeDlg.h"

#include "md5.h"

// user_register 对话框

 

IMPLEMENT_DYNAMIC(user_register, CDialogEx)

 

user_register::user_register(CWnd* pParent /*=NULL*/)

: CDialogEx(user_register::IDD, pParent)

{

 

}

 

user_register::~user_register()

{

}

 

void user_register::DoDataExchange(CDataExchange* pDX)

{

CDialogEx::DoDataExchange(pDX);

DDX_Control(pDX, IDC_EDIT1, user_name);

DDX_Control(pDX, IDC_EDIT2, user_password);

}

 

 

BEGIN_MESSAGE_MAP(user_register, CDialogEx)

ON_BN_CLICKED(IDC_BUTTON1, &user_register::OnBnClickedButton1)

ON_BN_CLICKED(IDC_BUTTON2, &user_register::OnBnClickedButton2)

END_MESSAGE_MAP()

 

 

// user_register 消息处理程序

 

 

void user_register::OnBnClickedButton1()

{

// TODO: 在此添加控件通知处理程序代码

CString get_user_name;

user_name.GetWindowText(get_user_name);

if(get_user_name!="")

{

char sql[100] = {0};

sprintf_s(sql,"select user_name from register_user_information where user_name = '%s'",get_user_name);

list<string>lststr;

theApp.my_sql.SelectMySql (sql,1,lststr);

if(lststr.size()>0)

{

MessageBox (_T("此用户已被使用"));

return;

}

CString get_user_password;

user_password.GetWindowText(get_user_password);

if(get_user_password==""){

MessageBox(_T("密码为空"));

}

else

{

CTime t = CTime::GetCurrentTime();

CString strTime = t.Format(_T("%Y-%m-%d %H:%M:%S"));

//***************************************使用MD5算法加密***********************************

sprintf_s(sql,"insert into register_user_information values('%s',md5('%s'),'%s')",get_user_name,get_user_password, strTime);

theApp.my_sql.UpdateMySql(sql);

char select_user_name[100]={0};

list<string> list_select_user_name;

sprintf_s(select_user_name,"select user_name from register_user_information where user_name='%s'",get_user_name);

theApp.my_sql.SelectMySql(select_user_name,1,list_select_user_name);

if(list_select_user_name.size()>0)

{

//将数据清空

list_select_user_name.pop_front();

MessageBox (_T("注册成功!"));

}

}

}

else

{

MessageBox(_T("请输入用户名"));

}

}

 

 

void user_register::OnBnClickedButton2()    //取消

{

// TODO: 在此添加控件通知处理程序代码

CsafeDlg safe;

theApp.m_pMainWnd=&safe;

EndDialog(IDOK);

safe.DoModal();

}

 

 

BOOL user_register::PreTranslateMessage(MSG* pMsg)

{

// TODO: 在此添加专用代码和/或调用基类

if(pMsg->message==WM_KEYDOWN && pMsg->wParam==13)

{

return true;

}

return CDialogEx::PreTranslateMessage(pMsg);

}

 

 

BOOL user_register::OnInitDialog()

{

CDialogEx::OnInitDialog();

 

SetWindowText("用户注册");

 

return TRUE;  

 

}

 

 

 

2>:选项界面

头文件:

#pragma once

#include "afxwin.h"

 

 

// user_select 对话框

 

class user_select : public CDialogEx

{

DECLARE_DYNAMIC(user_select)

 

public:

user_select(CWnd* pParent = NULL);   // 标准构造函数

virtual ~user_select();

 

// 对话框数据

enum { IDD = IDD_DIALOG4 };

 

protected:

virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

 

DECLARE_MESSAGE_MAP()

public:

CBitmapButton m_button;

virtual BOOL OnInitDialog();

afx_msg void OnBnClickedButton1();

};

 

成员函数的实现:

// user_select.cpp : 实现文件

//

 

#include "stdafx.h"

#include "safe.h"

#include "user_select.h"

#include "afxdialogex.h"

#include "user_main.h"

 

// user_select 对话框

 

IMPLEMENT_DYNAMIC(user_select, CDialogEx)

 

user_select::user_select(CWnd* pParent /*=NULL*/)

: CDialogEx(user_select::IDD, pParent)

{

 

}

 

user_select::~user_select()

{

}

 

void user_select::DoDataExchange(CDataExchange* pDX)

{

CDialogEx::DoDataExchange(pDX);

DDX_Control(pDX, IDC_BUTTON1, m_button);

}

 

 

BEGIN_MESSAGE_MAP(user_select, CDialogEx)

ON_BN_CLICKED(IDC_BUTTON1, &user_select::OnBnClickedButton1)

END_MESSAGE_MAP()

 

 

// user_select 消息处理程序

 

 

 

 

BOOL user_select::OnInitDialog()

{

CDialogEx::OnInitDialog();

SetWindowText("用户选择");

m_button.LoadBitmaps(IDB_user_get_date);

 

 

return TRUE;  // return TRUE unless you set the focus to a control

 

// 异常: OCX 属性页应返回 FALSE

}

void user_select::OnBnClickedButton1()

{

// TODO: 在此添加控件通知处理程序代码

user_main m_user_main;

theApp.m_pMainWnd=&m_user_main;

EndDialog(IDOK);

m_user_main.DoModal();

}

 

3>:数据捕获截面的实现

  头文件:

  #pragma once

 

#include "pcap.h"  

#include <winsock2.h>  

#include <stdio.h>

#include "afxwin.h"

 

//相关的结构体函数(数据包的包头信息)

struct ether_header

{

u_int8_t ether_dhost[6]; //目的Mac地址  

u_int8_t ether_shost[6]; //Mac地址  

u_int16_t ether_type;    //协议类型  

};

 

struct ip_header

{

#if defined(WORDS_BIENDIAN)  

u_int8_t   ip_version : 4,

ip_header_length : 4;

#else  

u_int8_t   ip_header_length : 4,

ip_version : 4;

#endif  

u_int8_t    ip_tos;

u_int16_t   ip_length;

u_int16_t   ip_id;

u_int16_t   ip_off;

u_int8_t    ip_ttl;

u_int8_t    ip_protocol;

u_int16_t   ip_checksum;

struct in_addr ip_souce_address;

struct in_addr ip_destination_address;

};

 

 

 

// user_main 对话框

 

class user_main : public CDialogEx

{

DECLARE_DYNAMIC(user_main)

 

public:

user_main(CWnd* pParent = NULL);   // 标准构造函数

virtual ~user_main();

 

// 对话框数据

enum { IDD = IDD_DIALOG2 };

protected:

virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

 

DECLARE_MESSAGE_MAP()

public:

CListCtrl list_information;

virtual BOOL OnInitDialog();

afx_msg void OnBnClickedButton1();

afx_msg void OnBnClickedButton2();

int m_radio;

string m_user_chose;

HANDLE m_chose_event_tcp;

HANDLE m_chose_threed_tcp;

 

HANDLE m_totol_date_event;

HANDLE m_totol_date_threed;

HANDLE select_netmask;

HANDLE EVENT_select_netmask;

 

bool m_flag;

BOOL bool_select_netmask;

 

int argc;

char **argv;

int bj_protocol;

int protocol_date;

 

int protocol;     //ip首部中的协议字段的数据

afx_msg void OnBnClickedButton3();

bool bool_start;

afx_msg void OnBnClickedButton4();

CEdit tcp_count;

CEdit udp_count;

CEdit icmp_count;

CEdit igmp_count;

int ip_date_len;

public:

CListBox selecet_equipment;

afx_msg void OnBnClickedButton5();

public:

FILE *log_file;

char * iptos(u_long in);

static void ip_protool_packet_callback(u_char *argument, const struct pcap_pkthdr* packet_header, const u_char* packet_content);

static void ethernet_protocol_packet_callback(u_char *argument, const struct pcap_pkthdr* packet_header, const u_char* packet_content);

void ifprint(pcap_if_t *d);

int i;

CString netmask_information;

afx_msg void OnLbnDblclkList3();

CListBox header_information;

ip_header *ip_h;

CEdit current_netmask_name;

pcap_if_t * alldevs;

pcap_if_t * d;

pcap_t * adhandle;

char errbuf[PCAP_ERRBUF_SIZE];

int num;

u_char argument;

afx_msg void OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult);

pcap_pkthdr packet_header;

u_char packet_content;

int int_tcp_count;

int int_udp_count;

int int_icmp_count;

int int_igmp_count;

int int_arp_count;

int int_rarp_count;

CEdit arp_count;

CEdit rarp_count;

};

 

成员函数的实现:

// user_main.cpp : 实现文件

//

#include "stdafx.h"

#include "safe.h"

#include "user_main.h"

#include "afxdialogex.h"

#include "safeDlg.h"

#include "user_select.h"

#include <winsock2.h>  

#include "pcap.h"

#include "stdlib.h"

#include <remote-ext.h>

 

#pragma comment(lib,"wpcap.lib")  

#pragma comment(lib,"packet.lib")  

#pragma comment(lib,"ws2_32.lib")  

 

#define IPTOSBUFFERS 12  

 

#define LINE_LEN 16

// user_main 对话框

 

IMPLEMENT_DYNAMIC(user_main, CDialogEx)

 

user_main::user_main(CWnd* pParent /*=NULL*/)

: CDialogEx(user_main::IDD ,pParent)

, m_radio(0)

{

m_flag=true;

bool_start=true;

i=0;

netmask_information="";

bool_select_netmask=TRUE;

num=0;

int_tcp_count=0;

int_udp_count=0;

int_icmp_count=0;

int_igmp_count=0;

int_arp_count=0;

int_rarp_count=0;

//argument = 0;

//packet_header = 0;

//packet_content = 0;

}

 

user_main::~user_main()

{

}

 

void user_main::DoDataExchange(CDataExchange* pDX)

{

CDialogEx::DoDataExchange(pDX);

DDX_Control(pDX, IDC_LIST1, list_information);

DDX_Radio(pDX, IDC_RADIO1, m_radio);

 

DDX_Control(pDX, IDC_EDIT3, tcp_count);

DDX_Control(pDX, IDC_EDIT2, udp_count);

DDX_Control(pDX, IDC_EDIT1, icmp_count);

DDX_Control(pDX, IDC_EDIT4, igmp_count);

DDX_Control(pDX, IDC_LIST3, selecet_equipment);

DDX_Control(pDX, IDC_LIST4, header_information);

DDX_Control(pDX, IDC_EDIT5, current_netmask_name);

DDX_Control(pDX, IDC_EDIT6, arp_count);

DDX_Control(pDX, IDC_EDIT7, rarp_count);

}

 

 

BEGIN_MESSAGE_MAP(user_main, CDialogEx)

ON_BN_CLICKED(IDC_BUTTON1, &user_main::OnBnClickedButton1)

ON_BN_CLICKED(IDC_BUTTON2, &user_main::OnBnClickedButton2)

ON_BN_CLICKED(IDC_BUTTON3, &user_main::OnBnClickedButton3)

ON_BN_CLICKED(IDC_BUTTON4, &user_main::OnBnClickedButton4)

ON_BN_CLICKED(IDC_BUTTON5, &user_main::OnBnClickedButton5)

ON_LBN_DBLCLK(IDC_LIST3, &user_main::OnLbnDblclkList3)

ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &user_main::OnNMDblclkList1)

END_MESSAGE_MAP()

 

 

// user_main 消息处理程序

 

 

 

BOOL user_main::OnInitDialog()

{

CDialogEx::OnInitDialog();

 

SetWindowText("数据抓包");

 

CRect m_rect;

list_information.GetClientRect(&m_rect);

int m_width=m_rect.Width()/4;

list_information.InsertColumn(0,"编号",0,m_width);

list_information.InsertColumn(1,"数据类型",0,m_width);

list_information.InsertColumn(2,"数据长度",0,m_width);

list_information.InsertColumn(3,"数据捕获数据的时间",m_width);

 

tcp_count.SetWindowText("0");

udp_count.SetWindowText("0");

icmp_count.SetWindowText("0");

igmp_count.SetWindowText("0");

arp_count.SetWindowText("0");

rarp_count.SetWindowText("0");

 

return TRUE;  // return TRUE unless you set the focus to a control

}

 

int ip_date_count=0;

 

//过滤事件的线程函数

DWORD WINAPI ThreadProc_tcp(  LPVOID lpParameter){

user_main *pthis=(user_main*)lpParameter;

CTime t;

CString strTime;

while(pthis->bool_start){

//等待100s 超时的时候 继续等待  

if(WaitForSingleObject(pthis->m_chose_event_tcp,100) == WAIT_TIMEOUT)

{

continue;

}

//根据选项抓包  根据所选取的端口号进项监听 捕获流经相应端口的数据

//2:提取iP头中的协议字段的数值  获取与需要截获的数据的类型相同的数据

//pthis->protocol=(int)pthis->select_ip_date.ip_protocol->ip_protocol;

//3:当协议字段满足条件时,将截获数据的时间设置为有信号  将过滤事件设置为有信号

if(pthis->protocol==pthis->bj_protocol){

pthis->protocol_date=pthis->protocol;

}

//获取数据   根据数据包的包头中的字段进行分析

//1: 获取数据的长度

//pthis->ip_date_len=pthis->select_ip_date.ip_protocol->ip_length;

//2:获取系统时间

t = CTime::GetCurrentTime();

strTime = t.Format(_T("%Y-%m-%d %H:%M:%S"));

//插入数据

char a[100]={0};

CString str=itoa(ip_date_count,a,10);

pthis->list_information.InsertItem(0,str);

//跟据协议字段的类型  选择需要加载的信息的类型

if(pthis->protocol_date==1)        pthis->list_information.SetItemText(0,1,"TCMP");

else if(pthis->protocol_date==2)   pthis->list_information.SetItemText(0,1,"IGMP");

else if(pthis->protocol_date==6)   pthis->list_information.SetItemText(0,1,"TCP");

else if(pthis->protocol_date==17)  pthis->list_information.SetItemText(0,1,"UDP");

char l[100]={0};

CString ip_date_length=itoa(pthis->ip_date_len,l,10);

pthis->list_information.SetItemText(0,2,ip_date_length);

pthis->list_information.SetItemText(0,3,strTime);

CString current_equipment_info;

pthis->current_netmask_name.GetWindowText(current_equipment_info);

if ((pthis->adhandle = pcap_open_live(current_equipment_info, 65536, 1, 1000,pthis->errbuf)) == NULL)

{

::MessageBox(NULL,"\nUnable to open the adapter.%s is not supported by WinPcap","提示",NULL);

pcap_freealldevs(pthis->alldevs);

return -1;

}

//释放列表  

//pcap_freealldevs(pthis_totol->alldevs);

 

//开始捕捉  ///*************************************************

//pthis_totol->ethernet_protocol_packet_callback(&(pthis_totol->argument),&(pthis_totol->packet_header),&(pthis_totol->packet_content));

pcap_loop(pthis->adhandle, -1,user_main::ip_protool_packet_callback, NULL);

 

}

return 0;

}

 

//截获用户需要过滤的数据

void user_main::OnBnClickedButton1()

{

// TODO: 在此添加控件通知处理程序代码

UpdateData();

    //将事件设置为有信号

//1:根据需要过滤的选项选择需要的数据  进行处理

switch(m_radio)

{

case 0:

        bj_protocol=6;

break;

case 1:

bj_protocol=17;

break;

case 2:

bj_protocol=1;

break;

case 3:

    bj_protocol=2;

break;

default:

break;

}

//当用户没有选择网卡时  不能进入相应的线程函数

//当选项信息  不是空的时候  将截获数据的事件的信息号设置为有信号

m_chose_event_tcp = CreateEvent(NULL,FALSE,FALSE,NULL);

if(netmask_information!=""){

m_chose_threed_tcp = CreateThread(NULL,0,&ThreadProc_tcp,this,0,NULL);

SetEvent(m_chose_event_tcp);     //将事件设置为有信号

}

else{

MessageBox("请先选择相应的网卡");

}

}

 

 

void user_main::OnBnClickedButton2()

{

// TODO: 在此添加控件通知处理程序代码

user_select m_user_select;

theApp.m_pMainWnd=&m_user_select;

EndDialog(IDOK);

m_user_select.DoModal();

}

 

 

void user_main::ethernet_protocol_packet_callback(u_char *argument, const struct pcap_pkthdr* packet_header, const u_char* packet_content)

{

u_short ethernet_type;

struct ether_header *ethernet_protocol;

u_char *mac_string;

static int packet_number = 1;

//对获取到的数据进行编号

CString str_packet_number;

char c_packet_number[100]={0};

str_packet_number=itoa(packet_number,c_packet_number,10);

((user_main*)(theApp.m_pMainWnd))->header_information.AddString("获取的数据包的编号:"+str_packet_number);

//获取当前的系统时间

CTime t = CTime::GetCurrentTime();

CString strTime = t.Format(_T("%Y-%m-%d %H:%M:%S"));

((user_main*)(theApp.m_pMainWnd))->header_information.AddString("捕获时间:"+strTime);

//获取数据包的长度

CString str_len;

char c_len[100]={0};

str_len=itoa(packet_header->len,c_len,10);

((user_main*)(theApp.m_pMainWnd))->header_information.AddString("数据包的长度:"+str_len);

 

//将数据加载到List_information上面

((user_main*)(theApp.m_pMainWnd))->list_information.InsertItem(0,str_packet_number);

((user_main*)(theApp.m_pMainWnd))->list_information.SetItemText(0,2,str_len);

((user_main*)(theApp.m_pMainWnd))->list_information.SetItemText(0,3,strTime);

 

((user_main*)(theApp.m_pMainWnd))->header_information.AddString("---------以太网协议---------");

 

ethernet_protocol = (struct ether_header*)packet_content;//获得数据包内容  

 

ethernet_type = ntohs(ethernet_protocol->ether_type);//获得以太网类型  

((user_main*)(theApp.m_pMainWnd))->header_information.AddString("以太网的类型是:"+ethernet_type);

switch (ethernet_type)

{

case 0x0800: ((user_main*)(theApp.m_pMainWnd))->header_information.AddString("上层协议是IP协议\n");

 ((user_main*)(theApp.m_pMainWnd))->list_information.SetItemText(0,1,"IP");

 

break;

case 0x0806: ((user_main*)(theApp.m_pMainWnd))->header_information.AddString("上层协议是ARP协议\n");

 ((user_main*)(theApp.m_pMainWnd))->list_information.SetItemText(0,1,"ARP");

  ((user_main*)(theApp.m_pMainWnd))->int_arp_count++;

break;

case 0x8035: ((user_main*)(theApp.m_pMainWnd))->header_information.AddString("上层协议是RARP协议\n");

 ((user_main*)(theApp.m_pMainWnd))->list_information.SetItemText(0,1,"RARP");

  ((user_main*)(theApp.m_pMainWnd))->int_rarp_count++;

break;

default:break;

}

mac_string = ethernet_protocol->ether_shost;

((user_main*)(theApp.m_pMainWnd))->header_information.AddString("MAC的原地址是:"+*mac_string+':'+*(mac_string + 1)+':'+ *(mac_string + 2)+':'+ *(mac_string + 3)+':'+ *(mac_string + 4)+':'+ *(mac_string + 5));

mac_string = ethernet_protocol->ether_dhost;

((user_main*)(theApp.m_pMainWnd))->header_information.AddString("MAC的目的地址是:"+*mac_string+':'+ *(mac_string + 1)+':'+ *(mac_string + 2)+':'+*(mac_string + 3)+':'+ *(mac_string + 4)+':'+ *(mac_string + 5));

packet_number++;

 

//return 0;

}

 

 

 

//用户截获数据的线程函数 不需要过滤数据  所有的数据都捕获

DWORD WINAPI ThreadProc_m_totol_date_event(  LPVOID lpParameter){

user_main *pthis_totol=(user_main*)lpParameter;

while(pthis_totol->bool_start){

if(WaitForSingleObject(pthis_totol->m_totol_date_event,100)==WAIT_TIMEOUT){

continue;

}

//监听数据  并将数据显示到窗口上

//转到选择的设备  

//打开失败  

CString current_equipment_info;

pthis_totol->current_netmask_name.GetWindowText(current_equipment_info);

if ((pthis_totol->adhandle = pcap_open_live(current_equipment_info, 65536, 1, 1000,pthis_totol->errbuf)) == NULL)

{

::MessageBox(NULL,"\nUnable to open the adapter.%s is not supported by WinPcap","提示",NULL);

pcap_freealldevs(pthis_totol->alldevs);

return -1;

}

//释放列表  

//pcap_freealldevs(pthis_totol->alldevs);

 

//开始捕捉  ///*************************************************

//pthis_totol->ethernet_protocol_packet_callback(&(pthis_totol->argument),&(pthis_totol->packet_header),&(pthis_totol->packet_content));

pcap_loop(pthis_totol->adhandle, -1,user_main::ethernet_protocol_packet_callback, NULL);

}

return 0;

}

 

//截获流经用户端口的所有的数据

void user_main::OnBnClickedButton3()

{

// TODO: 在此添加控件通知处理程序代码

CString str_equipment_information;

current_netmask_name.GetWindowText(str_equipment_information);

if(str_equipment_information!=""){

m_totol_date_event = CreateEvent(NULL,FALSE,FALSE,NULL);

m_totol_date_threed = CreateThread(NULL,0,&ThreadProc_m_totol_date_event,this,0,NULL);

SetEvent(m_totol_date_event);     //将事件设置为有信号

}

else{

MessageBox("请先选择所需捕获数据的网卡");

}

}

 

 

void user_main::OnBnClickedButton4()

{

// TODO: 在此添加控件通知处理程序代码

bool_start=false;

char c_tcp[100]={0};

char c_udp[100]={0};

char c_icmp[100]={0};

char c_igmp[100]={0};

char c_arp[100]={0};

char c_rarp[100]={0};

CString str_tcp=itoa(int_tcp_count,c_tcp,10);

CString str_udp=itoa(int_udp_count,c_udp,10);

CString str_icmp=itoa(int_icmp_count,c_icmp,10);

CString str_igmp=itoa(int_igmp_count,c_igmp,10);

CString str_arp=itoa(int_arp_count,c_arp,10);

CString str_rarp=itoa(int_rarp_count,c_rarp,10);

tcp_count.SetWindowText(str_tcp);

udp_count.SetWindowText(str_udp);

icmp_count.SetWindowText(str_icmp);

igmp_count.SetWindowText(str_igmp);

arp_count.SetWindowText(str_arp);

rarp_count.SetWindowText(str_rarp);

}

 

 

char * user_main::iptos(u_long in)

{

static char output[IPTOSBUFFERS][3 * 4 + 3 + 1];

static short which;

u_char *p;

p = (u_char *)∈

which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);

printf(output[which], "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);

return output[which];

}

 

int protocol_count=1;

void user_main::ip_protool_packet_callback(u_char *argument, const struct pcap_pkthdr* packet_header, const u_char* packet_content)

{

struct ip_header *ip_protocol;

u_int header_length = 0;

u_int offset;

u_char tos;

u_int16_t checksum;

//MAC首部是14位的,加上14位得到IP协议首部  

ip_protocol = (struct ip_header *) (packet_content + 14);

checksum = ntohs(ip_protocol->ip_checksum);

tos = ip_protocol->ip_tos;

offset = ntohs(ip_protocol->ip_off);

((user_main*)(theApp.m_pMainWnd))->header_information.AddString("#---------IP协议---------");

char num[100]={0};

CString str_num=itoa(protocol_count,num,10);

char c_ip_protocol_ip_version[100]={0};

CString str_ip_version=itoa(ip_protocol->ip_version,c_ip_protocol_ip_version,10);

((user_main*)(theApp.m_pMainWnd))->header_information.AddString("版本号:"+str_ip_version);

char c_header_length[100]={0};

CString str_header_length=itoa(header_length,c_header_length,10);

((user_main*)(theApp.m_pMainWnd))->header_information.AddString("首部长度:"+str_header_length);

char c_tos[100]={0};

CString str_tos=itoa(tos,c_tos,10);

((user_main*)(theApp.m_pMainWnd))->header_information.AddString("服务质量:"+str_tos);

char c_ntohs_ip_protocol_ip_length[100]={0};

CString str_ip_protocol_ip_length=itoa(ntohs(ip_protocol->ip_length),c_ntohs_ip_protocol_ip_length,10);

((user_main*)(theApp.m_pMainWnd))->header_information.AddString("总长度:"+str_ip_protocol_ip_length);

char c_ntohs_ip_protocol_ip_id[100]={0};

CString str_c_ntohs_ip_protocol_ip_id=itoa(ntohs(ip_protocol->ip_id),c_ntohs_ip_protocol_ip_id,10);

((user_main*)(theApp.m_pMainWnd))->header_information.AddString("标识:"+ str_c_ntohs_ip_protocol_ip_id);

//计算偏移量

char c_offset[100]={0};

CString str_offset=itoa((offset & 0x1fff) * 8,c_offset,10);

((user_main*)(theApp.m_pMainWnd))->header_information.AddString("偏移:"+str_offset);

 

//获取生存时间

char  c_ttl[100]={0};

CString str_ttl=itoa(ip_protocol->ip_ttl,c_ttl,10);

((user_main*)(theApp.m_pMainWnd))->header_information.AddString("生存时间:"+str_ttl);

 

//获取协议的类型

char c_ip_protocol[100]={0};

CString str_ip_protocol=itoa(ip_protocol->ip_protocol,c_ip_protocol,10);

((user_main*)(theApp.m_pMainWnd))->header_information.AddString("协议类型:"+str_ip_protocol);

if(((user_main*)(theApp.m_pMainWnd))->bj_protocol==ip_protocol->ip_protocol){

//根据协议的类型加载相关的数据

((user_main*)(theApp.m_pMainWnd))->list_information.InsertItem(0,str_num);

if(ip_protocol->ip_protocol==1){

((user_main*)(theApp.m_pMainWnd))->header_information.AddString("捕获到的数据的编号是:"+str_num);

((user_main*)(theApp.m_pMainWnd))->list_information.SetItemText(0,1,"ICMP");

((user_main*)(theApp.m_pMainWnd))->int_icmp_count++;

}else if(ip_protocol->ip_protocol==2){

((user_main*)(theApp.m_pMainWnd))->header_information.AddString("捕获到的数据的编号是:"+str_num);

((user_main*)(theApp.m_pMainWnd))->list_information.SetItemText(0,1,"IGMP");

((user_main*)(theApp.m_pMainWnd))->int_igmp_count++;

}else if(ip_protocol->ip_protocol==6){

((user_main*)(theApp.m_pMainWnd))->header_information.AddString("捕获到的数据的编号是:"+str_num);

((user_main*)(theApp.m_pMainWnd))->list_information.SetItemText(0,1,"TCP");

((user_main*)(theApp.m_pMainWnd))->int_tcp_count++;

}else if(ip_protocol->ip_protocol==17){

((user_main*)(theApp.m_pMainWnd))->header_information.AddString("捕获到的数据的编号是:"+str_num);

((user_main*)(theApp.m_pMainWnd))->list_information.SetItemText(0,1,"UDP");

((user_main*)(theApp.m_pMainWnd))->int_udp_count++;

}

 

((user_main*)(theApp.m_pMainWnd))->list_information.SetItemText(0,2,str_ip_protocol_ip_length);

CTime t = CTime::GetCurrentTime();

CString strTime = t.Format(_T("%Y-%m-%d %H:%M:%S"));

((user_main*)(theApp.m_pMainWnd))->header_information.AddString("捕获时间:"+strTime);

((user_main*)(theApp.m_pMainWnd))->list_information.SetItemText(0,3,strTime);

}

 

switch (ip_protocol->ip_protocol)

{

case 1: ((user_main*)(theApp.m_pMainWnd))->header_information.AddString("上层协议是ICMP协议:ICMP"); break;

case 2: ((user_main*)(theApp.m_pMainWnd))->header_information.AddString("上层协议是IGMP协议:IGMP"); break;

case 6: ((user_main*)(theApp.m_pMainWnd))->header_information.AddString("上层协议是TCP协议:TCP"); break;

case 17: ((user_main*)(theApp.m_pMainWnd))->header_information.AddString("上层协议是UDP协议:UDP"); break;

default:break;

}

char c_checksum[100]={0};

CString str_checksum=itoa(checksum,c_checksum,10);

((user_main*)(theApp.m_pMainWnd))->header_information.AddString("检验和:"+str_checksum);

CString str_ip_souce_address=inet_ntoa(ip_protocol->ip_souce_address);

((user_main*)(theApp.m_pMainWnd))->header_information.AddString("IP地址:%s\n"+str_ip_souce_address);

CString str_ip_destination_address=inet_ntoa(ip_protocol->ip_destination_address);

((user_main*)(theApp.m_pMainWnd))->header_information.AddString("目的地址:%s\n"+str_ip_destination_address);

protocol_count++;

}

 

 

void user_main::ifprint(pcap_if_t *d){

pcap_addr_t *a;

char c_i[100]={0};

CString str_i=itoa(++i,c_i,10);

CString str_1=d->name;

selecet_equipment.AddString(str_1);

if (d->description)

{

for (a = d->addresses; a != NULL; a = a->next)

{

char c_2[100]={0};

CString str_2=itoa(a->addr->sa_family,c_2,10);

//根据网卡信息列表中的数据的数目遍历整个列表上的数据  当没有相同的信息是 加载数据 有相同的则不加载数据

int a_count=selecet_equipment.GetCount();

int bj_0=0;

CString str_0_0;

for(int i=0;i<a_count;i++){

selecet_equipment.GetText(i,str_0_0);

if(str_2==str_0_0) bj_0=1; break;

}

if(bj_0==0){

selecet_equipment.AddString("\tAddress Family:#"+str_2);

}

 

switch (a->addr->sa_family)

{

case AF_INET:

selecet_equipment.AddString("\tAddress Family Name:AF_INET");

if (a->addr)

{

CString str_3=iptos(((struct sockaddr_in *)a->addr)->sin_addr.s_addr);

int bj_0_1=0;

int a_0_1=selecet_equipment.GetCount();

CString str_0_1;

for(int i=0;i<a_0_1;i++){

selecet_equipment.GetText(i,str_0_1);

if(str_0_1==str_3) bj_0_1=1; break;

}

if(bj_0_1==0){

selecet_equipment.AddString("\tAddress:"+str_3);

}

}

if (a->netmask)

{

CString str_4=iptos(((struct sockaddr_in *)a->netmask)->sin_addr.s_addr);

selecet_equipment.AddString("\tNetmask:"+str_4);

}

if (a->broadaddr)

{

CString str_5=iptos(((struct sockaddr_in *)a->broadaddr)->sin_addr.s_addr);

selecet_equipment.AddString("\tBroadcast Address:"+str_5);

}

if (a->dstaddr)

{

CString str_6= iptos(((struct sockaddr_in *)a->dstaddr)->sin_addr.s_addr);

selecet_equipment.AddString("\tDestination Address:"+str_6);

}

break;

default:

selecet_equipment.AddString("\tAddressFamilyName:Unknown");

break;

}

}

}

else{

return;

}

}

 

void user_main::OnBnClickedButton5()  //准备  将网卡信息加载到select_equipment 的控件上

{

// TODO: 在此添加控件通知处理程序代码

log_file=fopen("log.txt","w+");    //创建日志文件

/*取得列表*/

//pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf)

if (pcap_findalldevs(&alldevs, errbuf) == -1)

{

exit(1);

}

/*输出列表*/

for (d = alldevs; d != NULL; d = d->next)

{

ifprint(d);

}

/*ifprint(d);*/

if (i == 0)

{

MessageBox("No interfaces found!Make sure WinPcap is installed.");

return ;

}

}

 

 

DWORD WINAPI select_netmask_ThreadProc(  LPVOID lpParameter){

user_main *pthis_select_netmask=(user_main*)lpParameter;

while(pthis_select_netmask->bool_select_netmask){

pthis_select_netmask->bool_select_netmask=FALSE;

int index=pthis_select_netmask->selecet_equipment.GetCurSel();

if(index == -1){

return 0;

}

pthis_select_netmask->selecet_equipment.GetText(index,pthis_select_netmask->netmask_information);

pthis_select_netmask->current_netmask_name.SetSel(0,-1);

pthis_select_netmask->current_netmask_name.Clear();

pthis_select_netmask->current_netmask_name.SetWindowText(pthis_select_netmask->netmask_information);

}

pthis_select_netmask->bool_select_netmask=TRUE;

return 0;

}

 

void user_main::OnLbnDblclkList3() //双击select_equipment中的网卡选项-------将网卡选中

{

// TODO: 在此添加控件通知处理程序代码

select_netmask=CreateThread(NULL,0,&select_netmask_ThreadProc,this,0,0);

SetEvent(EVENT_select_netmask);

}

 

 

void user_main::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)

{

LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);

*pResult = 0;

// TODO: 在此添加控件通知处理程序代码

*pResult = 0;

}

 

4>APP

头文件:

 

// safeDlg.h : 头文件

//

 

#pragma once

#include "afxwin.h"

 

 

// CsafeDlg 对话框

class CsafeDlg : public CDialogEx

{

// 构造

public:

CsafeDlg(CWnd* pParent = NULL); // 标准构造函数

 

// 对话框数据

enum { IDD = IDD_SAFE_DIALOG };

 

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

 

 

// 实现

protected:

HICON m_hIcon;

 

// 生成的消息映射函数

virtual BOOL OnInitDialog();

afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

afx_msg void OnPaint();

afx_msg HCURSOR OnQueryDragIcon();

DECLARE_MESSAGE_MAP()

public:

afx_msg void OnBnClickedButton1();

CStatic m_picture;

CEdit user_name;

CEdit user_password;

CBitmap m_bitmap;

afx_msg void OnBnClickedButton2();

afx_msg void OnBnClickedButton3();

virtual BOOL PreTranslateMessage(MSG* pMsg);

};

 

成员函数的实现:

 

// safeDlg.h : 头文件

//

 

#pragma once

#include "afxwin.h"

 

 

// CsafeDlg 对话框

class CsafeDlg : public CDialogEx

{

// 构造

public:

CsafeDlg(CWnd* pParent = NULL); // 标准构造函数

 

// 对话框数据

enum { IDD = IDD_SAFE_DIALOG };

 

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

 

 

// 实现

protected:

HICON m_hIcon;

 

// 生成的消息映射函数

virtual BOOL OnInitDialog();

afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

afx_msg void OnPaint();

afx_msg HCURSOR OnQueryDragIcon();

DECLARE_MESSAGE_MAP()

 

// safeDlg.cpp : 实现文件

 

#include "stdafx.h"

#include "safe.h"

#include "safeDlg.h"

#include "afxdialogex.h"

#include "user_register.h"

#include "user_main.h"

#include "user_select.h"

 

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

 

 

// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

 

class CAboutDlg : public CDialogEx

{

public:

CAboutDlg();

 

// 对话框数据

enum { IDD = IDD_ABOUTBOX };

 

protected:

virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

 

// 实现

protected:

DECLARE_MESSAGE_MAP()

};

 

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)

{

}

 

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialogEx::DoDataExchange(pDX);

}

 

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)

END_MESSAGE_MAP()

 

 

// CsafeDlg 对话框

 

 

 

CsafeDlg::CsafeDlg(CWnd* pParent /*=NULL*/)

: CDialogEx(CsafeDlg::IDD, pParent)

{

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

 

m_bitmap.LoadBitmap(IDB_power);

}

 

void CsafeDlg::DoDataExchange(CDataExchange* pDX)

{

CDialogEx::DoDataExchange(pDX);

DDX_Control(pDX, IDC_m_picture, m_picture);

DDX_Control(pDX, IDC_EDIT1, user_name);

DDX_Control(pDX, IDC_EDIT2, user_password);

}

 

BEGIN_MESSAGE_MAP(CsafeDlg, CDialogEx)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_BUTTON1, &CsafeDlg::OnBnClickedButton1)

ON_BN_CLICKED(IDC_BUTTON2, &CsafeDlg::OnBnClickedButton2)

ON_BN_CLICKED(IDC_BUTTON3, &CsafeDlg::OnBnClickedButton3)

END_MESSAGE_MAP()

 

 

// CsafeDlg 消息处理程序

 

BOOL CsafeDlg::OnInitDialog()

{

CDialogEx::OnInitDialog();

 

// 将“关于...”菜单项添加到系统菜单中。

 

// IDM_ABOUTBOX 必须在系统命令范围内。

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

 

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

BOOL bNameValid;

CString strAboutMenu;

bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);

ASSERT(bNameValid);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

 

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动

//  执行此操作

SetIcon(m_hIcon, TRUE); // 设置大图标

SetIcon(m_hIcon, FALSE); // 设置小图标

 

// TODO: 在此添加额外的初始化代码

SetWindowText("用户登录");

m_picture.SetBitmap(m_bitmap);

 

return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE

}

 

void CsafeDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialogEx::OnSysCommand(nID, lParam);

}

}

 

// 如果向对话框添加最小化按钮,则需要下面的代码

//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,

//  这将由框架自动完成。

 

void CsafeDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // 用于绘制的设备上下文

 

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

 

// 使图标在工作区矩形中居中

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;

 

// 绘制图标

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialogEx::OnPaint();

}

}

 

//当用户拖动最小化窗口时系统调用此函数取得光标

//显示。

HCURSOR CsafeDlg::OnQueryDragIcon()

{

return static_cast<HCURSOR>(m_hIcon);

}

 

 

 

void CsafeDlg::OnBnClickedButton1()   //注册

{

// TODO: 在此添加控件通知处理程序代码

user_register user_reg;

theApp.m_pMainWnd=&user_reg;

EndDialog(IDOK);

user_reg.DoModal();

}

 

 

void CsafeDlg::OnBnClickedButton2()   //登录

{

// TODO: 在此添加控件通知处理程序代码

char sql[1000] = {0};

CString get_user_name;

CString get_user_password;

user_name.GetWindowText(get_user_name);

if(get_user_name==""){

MessageBox(_T("请输入用户名"));

}

else{

user_password.GetWindowText(get_user_password);

if(get_user_password==""){

MessageBox(_T("请输入用对用户名的密码"));

}

else{

sprintf_s(sql,"select user_name from register_user_information where user_name = '%s' and user_password = md5('%s')",get_user_name,get_user_password);

list<string>lststr;

theApp.my_sql.SelectMySql (sql,1,lststr);

if(lststr.size()>0)

{

//当找到合适的匹配的用户信息的时候  就将链表中的数据清空   

lststr.pop_front();

//当登陆成功是  跳转到数据抓包界面

/*user_main u_main;

theApp.m_pMainWnd=&u_main;

EndDialog(IDOK);

u_main.DoModal();*/

user_select m_user_select;

theApp.m_pMainWnd=&m_user_select;

EndDialog(IDOK);

m_user_select.DoModal();

}

else

{

MessageBox(_T("密码错误,请重新输入!"));

user_name.SetSel(0,-1);

user_name.Clear();

user_password.SetSel(0,-1);

user_password.Clear();

}

}

}

}

 

 

void CsafeDlg::OnBnClickedButton3()   //取消

{

// TODO: 在此添加控件通知处理程序代码

SendMessage(WM_CLOSE);                    //退出程序

}

 

 

BOOL CsafeDlg::PreTranslateMessage(MSG* pMsg)

{

// TODO: 在此添加专用代码和/或调用基类

if(pMsg->message==WM_KEYDOWN && pMsg->wParam==13)

{

return true;

}

return CDialogEx::PreTranslateMessage(pMsg);

}

 

afx_msg void OnBnClickedButton1();

CStatic m_picture;

CEdit user_name;

CEdit user_password;

CBitmap m_bitmap;

afx_msg void OnBnClickedButton2();

afx_msg void OnBnClickedButton3();

virtual BOOL PreTranslateMessage(MSG* pMsg);

};

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42211587/article/details/80800474

智能推荐

【软件基础】面向对象分析与设计思想总结-程序员宅基地

文章浏览阅读1.3k次。面向对象的本质:通过对象之间的协作完成功能。面向对象的特点:采用封装、继承、多态和抽象等设计方法。面向过程和面向对象开发中,在分析问题面向过程:拿到问题分析问题如何解决的步骤;面向对象:拿到问题分析问题中有哪些类,类的属性与方法,类与类之间的关系。面向对象遵循:合适的方法应该出现在合适的类中。_面向对象分析

电脑应用工具背景变为护眼绿?_电脑被护眼助手弄得背景是绿色的-程序员宅基地

文章浏览阅读424次。背景变为护眼绿?1、打开注册表--利用doc命令,即“Win+R”组合快捷键打开“运行”,输入regedit命令。2、修改路径下的值 路径:HKEY_CURRENT_USER-&gt;Control Panel-&gt;Colors-&gt;双击window 将其值改为:204 232 207 3、重启系统即可!4.若对你有所帮助请点个赞。..._电脑被护眼助手弄得背景是绿色的

双系统linux分多少内存,win+linux双系统的用户,你们的linux分了多少分区?-程序员宅基地

文章浏览阅读943次。hgywww 于 2010-02-03 22:19:15发表:挺好的调查kantiede 于 2010-01-31 14:39:50发表:学习爱唯一 于 2010-01-31 12:13:32发表:分给linux十个G,然后给他分了四个区sagawf 于 2009-11-17 21:03:54发表:win10Gfedora11 15Gyanchao1988 于 2009-11-17 11..._win+lin双系统lin配置多少储存

神经网络硕士就业前景,计算神经科学就业前景_神经网络就业-程序员宅基地

文章浏览阅读7.8k次。一、算法工程师简介(通常是月薪15k以上,年薪18万以上,只是一个概数,具体薪资可以到招聘网站如拉钩,猎聘网上看看)算法工程师目前是一个高端也是相对紧缺的职位;算法工程师包括音/视频算法工程师(通常统称为语音/视频/图形开发工程师)、图像处理算法工程师、计算机视觉算法工程师、通信基带算法工程师、信号算法工程师、射频/通信算法工程师、自然语言算法工程师、数据挖掘算法工程师、搜索算法工程师、控制算法工程师(云台算法工程师,飞控算法工程师,机器人控制算法)、导航算法工程师(@之介感谢补充)、其他【其他一切需要复杂_神经网络就业

Cocos Creator中使用对象池(官方文档摘录)_cocos creator网络请求时如何获取当前的对象-程序员宅基地

文章浏览阅读3k次。在运行时进行节点的创建(cc.instantiate)和销毁(node.destroy)操作是非常耗费性能的,因此我们在比较复杂的场景中,通常只有在场景初始化逻辑(onLoad)中才会进行节点的创建,在切换场景时才会进行节点的销毁。如果制作有大量敌人或子弹需要反复生成和被消灭的动作类游戏,我们要如何在游戏进行过程中随时创建和销毁节点呢?这里就需要对象池的帮助了。对象池的概念对象池就是一组可回收的节_cocos creator网络请求时如何获取当前的对象

网管软件——Acronis True Image Enterprise Server 9-程序员宅基地

文章浏览阅读206次。服务器的系统备份一直困饶着企业网管,ghost也是从版本8系列开始支持ntfs格式,虽说也可以达到了备份服务器系统的要求,但效果无法满足实时备份(系统运行过程中实行备份),现在介绍的是由acronis出品的Acronis True Image Enterprise Server可以实现一健(F11)进行备份及恢复,而且可以在增量备份,不影响系统正常运行的情况下。这是安装好后..._acronis true image 9

随便推点

KindEditor 编辑器在springboot使用_springboot kindeditor-程序员宅基地

文章浏览阅读1.7k次。KindEditor 编辑器在springboot使用官网下载kindEditor解决视频上传问题官网下载kindEditor **1. **官网地址 : http://kindeditor.net/down.php****2.下载后解压;将解压文件引入到项目中由于在java中使用;去掉不用的文件 asp,asp.net jsp;3.引入js,我这里使用的是thymeleaf模板4.html页面引入 ;也可以在页面直接引入js ; 添加文本框 <th:block th:_springboot kindeditor

网络安全人才青黄不接、数字化转型迫在眉睫、你还在犹豫吗?_网安行业需要的是顶尖人才-程序员宅基地

文章浏览阅读5.3k次,点赞5次,收藏10次。网络上关于质疑大专学历进入网络安全行业的声音越来越多了,居然有很多人在质疑大专学历从事网络安全没有竞争力。很多人看到某些招聘软件上起薪12K的薪资就望而却步了,觉得自己的能力不配拥有这样的高薪,并且网络安全还是属于计算机行业的。有这样的担忧其实不是空穴来风,因为计算机行业近年来的发展速度快,行业内很多岗位已经呈现出了饱和的现象,特别是程序员这种重复性工作的岗位。由于市场人才的饱和,所以公司可以用同样的价钱找到条件更好的人才。所以就出现了近年来,网络安全行业的要求越来越高,非985、211都对很多岗位望而却步_网安行业需要的是顶尖人才

vue element远程搜索下拉框出tooltip el-autocomplete下拉框出省略号时鼠标移上去出提示_el-autocomplete 下拉太长省略-程序员宅基地

文章浏览阅读2.3k次,点赞8次,收藏13次。vue element远程搜索下拉框出tooltip el-autocomplete下拉框出省略号时鼠标移上去出提示 需求如下效果图如下对el-tooltip进行了二次封装组件使用需求如下1.element远程搜索框下 下拉框文字超出宽度后会出省略号 要求鼠标移上去能够出文字效果图如下对el-tooltip进行了二次封装<template> <el-tooltip ref="tlp" :content="text" effect="dark" _el-autocomplete 下拉太长省略

Java多线程知识点总结(思维导图+源码笔记,Java架构师成长路线-程序员宅基地

文章浏览阅读713次,点赞5次,收藏10次。又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考以下是部分内容截图最后又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考以下是部分内容截图。

Sci-Hub的URL使用_scihub url-程序员宅基地

文章浏览阅读2.7k次。目录标题@[TOC](目录标题)借鉴文章出处URL就是出版商的文章页面路径,要把文章的全部网址复制到Sci-Hub主页的搜索框进行搜索。_scihub url

如何从零将vue+springboot项目打包部署到云服务器(亲测,图文教程超详细!!)_spring boot vue 部署 图解-程序员宅基地

文章浏览阅读5.2k次,点赞30次,收藏115次。手把手教如何将个人项目部署到云服务器(超详细!!)步骤目录手把手教如何将个人项目部署到云服务器(超详细!!)前言一、云服务器设置1.1 首先去购买一个云服务器,阿里或腾讯,具体步骤就不讲了1.2 拿到服务器后先修改密码1.3 修改服务器安全组策略1.4 远程连接云服务器二、远程服务器环境配置2.1 安装jdk(1) 将Linux系统下自带JDK(如果原先安装过,无则忽略)的删除(2) JDK11的安装(3) 设置JAVA_HOME2.2 安装配置MySQL(1)下载mysql(2)卸载Maria DB_spring boot vue 部署 图解