用c语言写了一个抓包器,图形界面是用gtk做的,我是在Linux系统中运行,不过gtk是跨平台的,应该在Windows下也能用。

功能:

捕获局域网内的所有数据包,并呈现在表格中,点击表格可以查看包的详细信息

通过指定条件过滤数据包,过滤条件可以是ip地址,mac地址,端口号,协议类型

控制包信息的显示,

统计一段时间内抓获的包的信息

发现局域网中的网元

使用的库 gtk -2.0

编译指令 gcc -g ip_dump.c -o ip_dump `pkg-config --cflags --libs gtk+-2.0 gthread-2.0`

资源在此:https://download.csdn.net/download/spaceemperor/75642030

演示

主界面

数据包统计

网元发现

源码:

#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<time.h>
#include<sys/time.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<net/ethernet.h>
#include<netinet/in_systm.h>
#include<netinet/in.h>
#include<netinet/ip.h>
#include<netinet/ip_icmp.h>
#define _FAVOR_BSD
#include<netinet/tcp.h>
#include<netinet/udp.h>
#include<netinet/if_ether.h>
#include<arpa/inet.h>#ifdef _linux
#include<linux/sockios.h>
#include<linux/if.h>
#else
#include<sys/ioctl.h>
#include<gtk/gtk.h>
//#include<net/bpf.h>
#include<net/if.h>
#include<fcntl.h>
#endif
#define MAXSIZE 65535
#define EXIT_FAILURE 0
#define TABLE_LEN 50
#define TABLE_NUM 10
//gcc -g  ip_dump.c -o ip_dump `pkg-config --cflags --libs gtk+-2.0 gthread-2.0`
int count=1;
int count2=1;
int item=0;
int volume=20;
int decide=1;
int decide2=1;
int pac_num=0;
GtkTextBuffer *bufferin,*bufferin2;
char **mac_unit;
char **mac_unit_buf;
char* mac_item="standard:ff:ff:ff:ff:ff:ff:ff:ff\n";
char* mac_item_buf="Ethnet UNIT OF MAC ADDRESS:";//char arr[4096]="packet\n";//global data
int MAC_broad_num;
int MAC_short_num;
int MAC_long_num;
int MAC_num;
int MAC_byte;
int MAC_speed;
int IP_num;
int IP_byte;
int IP_speed;
int TCP_num;
int UDP_num;
int ICMP_num;
int speed;
int ARP_num;
int passedtime;
char* starttime;
char* endtime;
int starttimeint;
int endtimeint;
//
GtkWidget *entry1;
GtkWidget *entry2;
GtkWidget *entry3;
GtkWidget *entry4;
GtkWidget *entry5;
GtkWidget *entry6;
GtkWidget *entry7;
GtkWidget *entry8;
GtkWidget *entry9;
GtkWidget *entry10;
GtkWidget *entry11;
GtkWidget *entry12;
GtkWidget *entry13;
GtkWidget *entry14;
GtkWidget *entry15;
GtkWidget *entry16;
GtkWidget *entry17;GtkWidget *list;struct Filter{char* src_mac_all;char* src_mac_res;char* des_mac_all;char* des_mac_res;char* src_ip_all;char* src_ip_res;char* des_ip_all;char* des_ip_res;char* src_port_all;char* src_port_res;char* des_port_all;char* des_port_res;char* pro_all;char* pro_res;
}filter;
struct service_type{int a;int e;int d;int h;char *interface;int arp;int ip;int tcp;int udp;int icmp;char* card;} Ser_Type;struct packet{int seq;char  src_mac[50];char  des_mac[50];char  src_ip[30];char  des_ip[30];char* src_port;char* des_port;char* type;char detail[1024];//char* description;}pac;struct packet pac_arr[TABLE_NUM][TABLE_LEN];
int pac_max_ptr=0;
int first_dec=0;
char* my_strstr(char  *s1, char  *s2);
void paint_count();
void begin_button(GtkButton *button);
void pause_button(GtkButton *button);
void continue_button(GtkButton *button);
void refresh_button(GtkButton *button);GtkWidget* create_Text();
GtkWidget* create_Text2();
GtkWidget *create_Table();
void insert_Table(struct packet *pact);
void insert_text(char* str);
void insert_text2(char* str);void on_check_clicked1(GtkWidget* check ,gint data);
void on_check_clicked2(GtkWidget* check ,gint data);
void enter_callback1(GtkWidget *widget,gpointer entry);
void enter_callback2(GtkWidget *widget,gpointer entry);
void enter_callback3(GtkWidget *widget,gpointer entry);
void enter_callback4(GtkWidget *widget,gpointer entry);
void enter_callback5(GtkWidget *widget,gpointer entry);
void enter_callback6(GtkWidget *widget,gpointer entry);
void enter_callback7(GtkWidget *widget,gpointer entry);
void enter_callback8(GtkWidget *widget,gpointer entry);
void enter_callback9(GtkWidget *widget,gpointer entry);
void enter_callback10(GtkWidget *widget,gpointer entry);
void enter_callback11(GtkWidget *widget,gpointer entry);
void enter_callback12(GtkWidget *widget,gpointer entry);
void enter_callback13(GtkWidget *widget,gpointer entry);
void enter_callback14(GtkWidget *widget,gpointer entry);
void enter_callback15(GtkWidget *widget,gpointer entry);
void select_row_callback(GtkWidget* clist,gint row,gint column,GdkEventButton* event,gpointer data);void print_data(char* index,int length,char*arr);
void print_ethernet(struct ether_header * eth,char* arr);
void print_arp(struct ether_arp* arp,char* arr);
void print_ip(struct ip* ip,char* arr);
void print_tcp(struct tcphdr* tcp,char*arr);
void print_icmp(struct icmp* icmp,char* arr);
void print_udp(struct udphdr* udp,char*arr);
void do_eth(struct ether_header* eth);
void do_arp(struct ether_arp* arp);
void do_ip(struct ip* ip);void work();
void our_thread1(GtkWidget *button);
int filt();
int filt1();
int filt2();
int filt3();
int filt4();
int filt5();
int filt6();
int filt7();
int filt8();
int filt9();
int filt10();
int filt11();
int filt12();
int filt13();
int filt14();char* mac_ntoa(u_char* d);
char* ip_ttoa(int flag);
char* ip_ftoa(int flag);
char* tcp_ftoa(int flag);
void rece_command(char *argv[]);void deal_switch_page(GtkNotebook *notebook,gpointer page,guint page_num,gpointer user_date){if(page_num==0){count=1;}if(page_num==1){count=0;char tbuf[25];time_t timer;//time_t就是long int 类型struct tm *tblock;timer = time(NULL);tblock = localtime(&timer);sprintf(tbuf,"%s", asctime(tblock));endtime=tbuf;endtimeint=time((time_t*)NULL); passedtime=endtimeint-starttimeint;MAC_speed=MAC_num/passedtime;IP_speed=IP_num/passedtime;speed=MAC_byte/passedtime;paint_count();}if(page_num==2){count=0;/*     insert_text2(mac_item_buf);strcat(mac_item,mac_item_buf);mac_item_buf="Ethnet UNIT OF MAC ADDRESS: ";//insert_text2("\n");*/}}int main(int argc,char *argv[]){rece_command(argv);if(!g_thread_supported())g_thread_init(NULL);gdk_threads_init();gtk_init(&argc,&argv);GtkWidget * window=gtk_window_new(GTK_WINDOW_TOPLEVEL);gtk_widget_set_size_request(window,1500,800);GtkWidget *notebook=gtk_notebook_new();gtk_container_add(GTK_CONTAINER(window),notebook);gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook),GTK_POS_TOP);//first pageGtkWidget *label=gtk_label_new("main page");GtkWidget *box=gtk_fixed_new();//GtkWidget *label1=gtk_label_new("interface");gtk_fixed_put(GTK_FIXED(box),label1,0,0);gtk_widget_set_size_request(label1,100,20);label1=gtk_label_new("allow");gtk_fixed_put(GTK_FIXED(box),label1,0,30);gtk_widget_set_size_request(label1,50,20);label1=gtk_label_new("resist");gtk_fixed_put(GTK_FIXED(box),label1,200,30);gtk_widget_set_size_request(label1,100,20);label1=gtk_label_new("source ip");gtk_fixed_put(GTK_FIXED(box),label1,0,180);gtk_widget_set_size_request(label1,100,20);label1=gtk_label_new("source ip");gtk_fixed_put(GTK_FIXED(box),label1,200,180);gtk_widget_set_size_request(label1,100,20);label1=gtk_label_new("dest ip");gtk_fixed_put(GTK_FIXED(box),label1,0,240);gtk_widget_set_size_request(label1,100,20);label1=gtk_label_new("dest ip");gtk_fixed_put(GTK_FIXED(box),label1,200,240);gtk_widget_set_size_request(label1,100,20);label1=gtk_label_new("source port");gtk_fixed_put(GTK_FIXED(box),label1,0,300);gtk_widget_set_size_request(label1,100,20);label1=gtk_label_new("source port");gtk_fixed_put(GTK_FIXED(box),label1,200,300);gtk_widget_set_size_request(label1,100,20);label1=gtk_label_new("dest port");gtk_fixed_put(GTK_FIXED(box),label1,0,360);gtk_widget_set_size_request(label1,100,20);label1=gtk_label_new("dest port");gtk_fixed_put(GTK_FIXED(box),label1,200,360);gtk_widget_set_size_request(label1,100,20);label1=gtk_label_new("protocol");gtk_fixed_put(GTK_FIXED(box),label1,0,420);gtk_widget_set_size_request(label1,100,20);label1=gtk_label_new("protocol");gtk_fixed_put(GTK_FIXED(box),label1,200,430);gtk_widget_set_size_request(label1,100,20);label1=gtk_label_new("display");gtk_fixed_put(GTK_FIXED(box),label1,100,480);gtk_widget_set_size_request(label1,100,20);label1=gtk_label_new("command");gtk_fixed_put(GTK_FIXED(box),label1,100,510);gtk_widget_set_size_request(label1,100,20);label1=gtk_label_new("protocol");gtk_fixed_put(GTK_FIXED(box),label1,100,570);gtk_widget_set_size_request(label1,100,20);label1=gtk_label_new("source mac");gtk_fixed_put(GTK_FIXED(box),label1,0,60);gtk_widget_set_size_request(label1,100,20);label1=gtk_label_new("source mac");gtk_fixed_put(GTK_FIXED(box),label1,200,60);gtk_widget_set_size_request(label1,100,20);label1=gtk_label_new("dest mac");gtk_fixed_put(GTK_FIXED(box),label1,0,120);gtk_widget_set_size_request(label1,100,20);label1=gtk_label_new("dest mac");gtk_fixed_put(GTK_FIXED(box),label1,200,120);gtk_widget_set_size_request(label1,100,20);//checkGtkWidget*check;check=gtk_check_button_new_with_label("all");gtk_fixed_put(GTK_FIXED(box),check,0,540);gtk_widget_set_size_request(check,100,30);g_signal_connect(G_OBJECT(check),"released",G_CALLBACK(on_check_clicked1),(gpointer)1);check=gtk_check_button_new_with_label("eth");gtk_fixed_put(GTK_FIXED(box),check,100,540);gtk_widget_set_size_request(check,100,30);g_signal_connect(G_OBJECT(check),"released",G_CALLBACK(on_check_clicked1),(gpointer)2);check=gtk_check_button_new_with_label("data");gtk_fixed_put(GTK_FIXED(box),check,200,540);gtk_widget_set_size_request(check,100,30);g_signal_connect(G_OBJECT(check),"released",G_CALLBACK(on_check_clicked1),(gpointer)3);check=gtk_check_button_new_with_label("help");gtk_fixed_put(GTK_FIXED(box),check,300,540);gtk_widget_set_size_request(check,100,30);g_signal_connect(G_OBJECT(check),"released",G_CALLBACK(on_check_clicked1),(gpointer)4);check=gtk_check_button_new_with_label("arp");gtk_fixed_put(GTK_FIXED(box),check,0,600);gtk_widget_set_size_request(check,100,30);g_signal_connect(G_OBJECT(check),"released",G_CALLBACK(on_check_clicked2),(gpointer)1);check=gtk_check_button_new_with_label("ip");gtk_fixed_put(GTK_FIXED(box),check,100,600);gtk_widget_set_size_request(check,100,30);g_signal_connect(G_OBJECT(check),"released",G_CALLBACK(on_check_clicked2),(gpointer)2);check=gtk_check_button_new_with_label("tcp");gtk_fixed_put(GTK_FIXED(box),check,200,600);gtk_widget_set_size_request(check,100,30);g_signal_connect(G_OBJECT(check),"released",G_CALLBACK(on_check_clicked2),(gpointer)3);check=gtk_check_button_new_with_label("udp");gtk_fixed_put(GTK_FIXED(box),check,300,600);gtk_widget_set_size_request(check,100,30);g_signal_connect(G_OBJECT(check),"released",G_CALLBACK(on_check_clicked2),(gpointer)4);check=gtk_check_button_new_with_label("icmp");gtk_fixed_put(GTK_FIXED(box),check,0,630);gtk_widget_set_size_request(check,100,30);g_signal_connect(G_OBJECT(check),"released",G_CALLBACK(on_check_clicked2),(gpointer)5);//entryGtkWidget *entry=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry,0,210);gtk_widget_set_size_request(entry,180,30);gtk_entry_set_text(GTK_ENTRY(entry),"all");g_signal_connect(entry,"activate",G_CALLBACK(enter_callback1),entry);entry=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry,200,210);gtk_widget_set_size_request(entry,180,30);//gtk_entry_set_text(GTK_ENTRY(entry),"all");g_signal_connect(entry,"activate",G_CALLBACK(enter_callback2),entry);entry=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry,0,270);gtk_widget_set_size_request(entry,180,30);gtk_entry_set_text(GTK_ENTRY(entry),"all");g_signal_connect(entry,"activate",G_CALLBACK(enter_callback3),entry);entry=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry,200,270);gtk_widget_set_size_request(entry,180,30);//gtk_entry_set_text(GTK_ENTRY(entry),"all");g_signal_connect(entry,"activate",G_CALLBACK(enter_callback4),entry);entry=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry,0,330);gtk_widget_set_size_request(entry,180,30);gtk_entry_set_text(GTK_ENTRY(entry),"all");g_signal_connect(entry,"activate",G_CALLBACK(enter_callback5),entry);entry=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry,200,330);gtk_widget_set_size_request(entry,180,30);//gtk_entry_set_text(GTK_ENTRY(entry),"all");g_signal_connect(entry,"activate",G_CALLBACK(enter_callback6),entry);entry=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry,0,390);gtk_widget_set_size_request(entry,180,30);gtk_entry_set_text(GTK_ENTRY(entry),"all");g_signal_connect(entry,"activate",G_CALLBACK(enter_callback7),entry);entry=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry,200,390);gtk_widget_set_size_request(entry,180,30);//gtk_entry_set_text(GTK_ENTRY(entry),"all");g_signal_connect(entry,"activate",G_CALLBACK(enter_callback8),entry);entry=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry,0,450);gtk_widget_set_size_request(entry,180,30);gtk_entry_set_text(GTK_ENTRY(entry),"all");g_signal_connect(entry,"activate",G_CALLBACK(enter_callback9),entry);entry=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry,200,450);gtk_widget_set_size_request(entry,180,30);//gtk_entry_set_text(GTK_ENTRY(entry),"all");g_signal_connect(entry,"activate",G_CALLBACK(enter_callback10),entry);entry=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry,0,90);gtk_widget_set_size_request(entry,180,30);gtk_entry_set_text(GTK_ENTRY(entry),"all");g_signal_connect(entry,"activate",G_CALLBACK(enter_callback11),entry);entry=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry,200,90);gtk_widget_set_size_request(entry,180,30);//gtk_entry_set_text(GTK_ENTRY(entry),"all");g_signal_connect(entry,"activate",G_CALLBACK(enter_callback12),entry);entry=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry,0,150);gtk_widget_set_size_request(entry,180,30);gtk_entry_set_text(GTK_ENTRY(entry),"all");g_signal_connect(entry,"activate",G_CALLBACK(enter_callback13),entry);entry=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry,200,150);gtk_widget_set_size_request(entry,180,30);//gtk_entry_set_text(GTK_ENTRY(entry),"all");g_signal_connect(entry,"activate",G_CALLBACK(enter_callback14),entry);char* intCon="all";if(Ser_Type.card!=NULL){intCon=Ser_Type.card;}entry=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry,100,0);gtk_widget_set_size_request(entry,180,20);gtk_entry_set_text(GTK_ENTRY(entry),intCon);g_signal_connect(entry,"activate",G_CALLBACK(enter_callback15),entry);//right display windowGtkWidget* text=create_Text();gtk_fixed_put(GTK_FIXED(box),text,450,400);gtk_widget_set_size_request(text,500,450); //ListGtkWidget *table=create_Table();gtk_fixed_put(GTK_FIXED(box),table,450,0);gtk_widget_set_size_request(table,1000,400);gtk_signal_connect(GTK_OBJECT(list),"select_row",GTK_SIGNAL_FUNC(select_row_callback),NULL);//begin buttonGtkWidget *button1=gtk_button_new_with_label("begin");gtk_fixed_put(GTK_FIXED(box),button1,0,670);gtk_widget_set_size_request(button1,100,30);g_signal_connect(button1,"pressed",G_CALLBACK( begin_button),NULL);//pause buttonGtkWidget *button2=gtk_button_new_with_label("pause");gtk_fixed_put(GTK_FIXED(box),button2,100,670);gtk_widget_set_size_request(button2,100,30);g_signal_connect(button2,"pressed",G_CALLBACK( pause_button),NULL);//continue buttonGtkWidget *button3=gtk_button_new_with_label("continue");gtk_fixed_put(GTK_FIXED(box),button3,200,670);gtk_widget_set_size_request(button3,100,30);g_signal_connect(button3,"pressed",G_CALLBACK( continue_button),NULL);//refresh buttonGtkWidget *button4=gtk_button_new_with_label("refresh");gtk_fixed_put(GTK_FIXED(box),button4,300,670);gtk_widget_set_size_request(button4,100,30);g_signal_connect(button4,"pressed",G_CALLBACK( refresh_button),NULL);gtk_notebook_append_page(GTK_NOTEBOOK(notebook),box,label);//second pagelabel=gtk_label_new("packet count");box=gtk_fixed_new();GtkWidget *label2=gtk_label_new("MAC_BROAD");gtk_fixed_put(GTK_FIXED(box),label2,0,0);gtk_widget_set_size_request(label2,100,20);label2=gtk_label_new("MAC_LONG");gtk_fixed_put(GTK_FIXED(box),label2,0,60);gtk_widget_set_size_request(label2,100,20);label2=gtk_label_new("MAC_SHORT");gtk_fixed_put(GTK_FIXED(box),label2,0,120);gtk_widget_set_size_request(label2,100,20);label2=gtk_label_new("MAC PACKET");gtk_fixed_put(GTK_FIXED(box),label2,0,180);gtk_widget_set_size_request(label2,100,20);label2=gtk_label_new("MAC SPEED");gtk_fixed_put(GTK_FIXED(box),label2,0,240);gtk_widget_set_size_request(label2,100,20);label2=gtk_label_new("MAC BYTE");gtk_fixed_put(GTK_FIXED(box),label2,0,300);gtk_widget_set_size_request(label2,100,20);label2=gtk_label_new("IP PACKET");gtk_fixed_put(GTK_FIXED(box),label2,0,360);gtk_widget_set_size_request(label2,100,20);label2=gtk_label_new("IP BYTE");gtk_fixed_put(GTK_FIXED(box),label2,0,420);gtk_widget_set_size_request(label2,100,20);label2=gtk_label_new("IP SPEED");gtk_fixed_put(GTK_FIXED(box),label2,0,480);gtk_widget_set_size_request(label2,100,20);label2=gtk_label_new("TCP");gtk_fixed_put(GTK_FIXED(box),label2,0,540);gtk_widget_set_size_request(label2,100,20);label2=gtk_label_new("UDP");gtk_fixed_put(GTK_FIXED(box),label2,0,600);gtk_widget_set_size_request(label2,100,20);label2=gtk_label_new("ARP");gtk_fixed_put(GTK_FIXED(box),label2,0,660);gtk_widget_set_size_request(label2,100,20);label2=gtk_label_new("ICMP");gtk_fixed_put(GTK_FIXED(box),label2,0,720);gtk_widget_set_size_request(label2,100,20);label2=gtk_label_new("start time");gtk_fixed_put(GTK_FIXED(box),label2,500,0);gtk_widget_set_size_request(label2,100,20);label2=gtk_label_new("end time");gtk_fixed_put(GTK_FIXED(box),label2,500,60);gtk_widget_set_size_request(label2,100,20);label2=gtk_label_new("passed time");gtk_fixed_put(GTK_FIXED(box),label2,500,120);gtk_widget_set_size_request(label2,100,20);label2=gtk_label_new("speed");gtk_fixed_put(GTK_FIXED(box),label2,500,180);gtk_widget_set_size_request(label2,100,20);//entryentry1=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry1,100,0);gtk_widget_set_size_request(entry1,200,30);entry2=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry2,100,60);gtk_widget_set_size_request(entry2,200,30);entry3=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry3,100,120);gtk_widget_set_size_request(entry3,200,30);entry15=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry15,100,180);gtk_widget_set_size_request(entry15,200,30);entry4=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry4,100,240);gtk_widget_set_size_request(entry4,200,30);entry5=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry5,100,300);gtk_widget_set_size_request(entry5,200,30);entry6=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry6,100,360);gtk_widget_set_size_request(entry6,200,30);entry7=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry7,100,420);gtk_widget_set_size_request(entry7,200,30);entry8=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry8,100,480);gtk_widget_set_size_request(entry8,200,30);entry9=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry9,100,540);gtk_widget_set_size_request(entry9,200,30);entry10=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry10,100,600);gtk_widget_set_size_request(entry10,200,30);entry11=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry11,100,660);gtk_widget_set_size_request(entry11,200,30);entry12=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry12,100,720);gtk_widget_set_size_request(entry12,200,30);entry13=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry13,600,0);gtk_widget_set_size_request(entry13,400,30);entry14=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry14,600,60);gtk_widget_set_size_request(entry14,400,30);entry16=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry16,600,120);gtk_widget_set_size_request(entry16,200,30);entry17=gtk_entry_new();gtk_fixed_put(GTK_FIXED(box),entry17,600,180);gtk_widget_set_size_request(entry17,200,30);gtk_notebook_append_page(GTK_NOTEBOOK(notebook),box,label);//third pagelabel=gtk_label_new("net unit found");box=gtk_fixed_new();GtkWidget* text2=create_Text2();gtk_fixed_put(GTK_FIXED(box),text2,50,50);gtk_widget_set_size_request(text2,700,600);gtk_notebook_append_page(GTK_NOTEBOOK(notebook),box,label);//g_signal_connect(notebook,"switch_page",G_CALLBACK(deal_switch_page),NULL);gtk_widget_show_all(window);mac_unit=(char**)malloc(sizeof(char*)*255);mac_unit_buf=(char**)malloc(sizeof(char*)*255);gdk_threads_enter();gtk_main();gdk_threads_leave();return 0;}void paint_count(){char buf_num[10]={0};sprintf(buf_num,"%d",MAC_broad_num);gtk_entry_set_text(entry1,buf_num);sprintf(buf_num,"%d",MAC_long_num);gtk_entry_set_text(entry2,buf_num);sprintf(buf_num,"%d",MAC_short_num);gtk_entry_set_text(entry3,buf_num);sprintf(buf_num,"%d",MAC_num);gtk_entry_set_text(entry15,buf_num);sprintf(buf_num,"%d",MAC_speed);gtk_entry_set_text(entry4,buf_num);sprintf(buf_num,"%d",MAC_byte);gtk_entry_set_text(entry5,buf_num);sprintf(buf_num,"%d",IP_num);gtk_entry_set_text(entry6,buf_num);sprintf(buf_num,"%d",IP_byte);gtk_entry_set_text(entry7,buf_num);sprintf(buf_num,"%d",IP_speed);gtk_entry_set_text(entry8,buf_num);sprintf(buf_num,"%d",TCP_num);gtk_entry_set_text(entry9,buf_num);sprintf(buf_num,"%d",UDP_num);gtk_entry_set_text(entry10,buf_num);sprintf(buf_num,"%d",ARP_num);gtk_entry_set_text(entry11,buf_num);sprintf(buf_num,"%d",ICMP_num);gtk_entry_set_text(entry12,buf_num);//sprintf(buf_num,"%d",ARP_num);gtk_entry_set_text(entry13,starttime);//sprintf(buf_num,"%d",speed);gtk_entry_set_text(entry14,endtime);sprintf(buf_num,"%d",passedtime);gtk_entry_set_text(entry16,buf_num);sprintf(buf_num,"%d",speed);gtk_entry_set_text(entry17,buf_num);}void begin_button(GtkButton *button){printf("1:%s\n",filter.src_ip_all);printf("2:%s\n",filter.src_ip_res);printf("3:%s\n",filter.des_ip_all);printf("4:%s\n",filter.des_ip_res);printf("5:%s\n",filter.src_port_all);printf("6:%s\n",filter.src_port_res);printf("7:%s\n",filter.des_port_all);printf("8:%s\n",filter.des_port_res);printf("9:%s\n",filter.pro_all);printf("10:%s\n",filter.pro_res);printf("a=%d\n",Ser_Type.a);printf("e=%d\n",Ser_Type.e);printf("d=%d\n",Ser_Type.d);printf("h=%d\n",Ser_Type.h);printf("interface is %s",Ser_Type.interface);printf("arp=%d\n",Ser_Type.arp);printf("ip=%d\n",Ser_Type.ip);printf("tcp=%d\n",Ser_Type.tcp);printf("udp=%d\n",Ser_Type.udp);printf("icmp=%d\n",Ser_Type.icmp);///*char tbuf[25];time_t timep;time(&timep);struct tm *p;p = gmtime(&timep);snprintf(tbuf , "%d-%d-%d %d:%d:%d", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, 8 + p->tm_hour, p->tm_min, p->tm_sec);starttime=tbuf;*//*char *tbuf;time_t timer;//time_t就是long int 类型struct tm *tblock;timer = time(NULL);tblock = localtime(&timer);sprintf(tbuf,"%s", asctime(tblock));starttime=tbuf;*/printf("chenck1\n");starttimeint=time((time_t*)NULL);    //gtk_widget_set_sensitive(button,FALSE);g_thread_create(our_thread1,button,FALSE,NULL);// work();}void pause_button(GtkButton *button){printf("pause\n");for(int i=0;i<pac_num%TABLE_LEN;i++){if(pac_max_ptr==0&&i==0)continue;printf("%d %d :",pac_max_ptr,i);printf("%s\n%s\n&&&&&&&&&&&&&&&&&&&&",pac_arr[pac_max_ptr][i].type,pac_arr[pac_max_ptr][i].detail);}if(count>0)count--;
}void continue_button(GtkButton *button){if(count<1)count++;
}void refresh_button(GtkButton *button){MAC_broad_num=0;MAC_short_num=0;MAC_long_num=0;MAC_num=0;MAC_byte=0;MAC_speed=0;IP_num=0;IP_byte=0;IP_speed=0;TCP_num=0;UDP_num=0;ICMP_num=0;speed=0;ARP_num=0;
/*
int passedtime;
char* starttime;
char* endtime=NULL;
int starttimeint;
int endtimeint;
*/}GtkWidget *create_Text()
{GtkWidget *scrolled_window;GtkWidget *view;//GtkTextBuffer *buffer;view = gtk_text_view_new ();GtkTextIter iter;bufferin = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));//bufferin=buffer;scrolled_window = gtk_scrolled_window_new (NULL, NULL);gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);gtk_container_add (GTK_CONTAINER (scrolled_window), view);/*gtk_text_buffer_get_iter_at_offset(bufferin,&iter,0);for(int i=0;i<5;i++){insert_text (bufferin,"i am your father!\n");}*/gtk_container_set_border_width(GTK_CONTAINER(scrolled_window),10);gtk_widget_show_all (scrolled_window);return scrolled_window;
}GtkWidget *create_Table()
{GtkWidget *scrolled_window;GtkWidget *view=gtk_clist_new(9);gtk_clist_set_column_title(GTK_CLIST(view),0,"number");gtk_clist_set_column_title(GTK_CLIST(view),1,"source mac address");gtk_clist_set_column_title(GTK_CLIST(view),2,"dest mac address");gtk_clist_set_column_title(GTK_CLIST(view),3,"source ip address  ");gtk_clist_set_column_title(GTK_CLIST(view),4,"dest ip address    ");gtk_clist_set_column_title(GTK_CLIST(view),5,"source port");gtk_clist_set_column_title(GTK_CLIST(view),6,"dest port");gtk_clist_set_column_title(GTK_CLIST(view),7,"protocol");gtk_clist_set_column_title(GTK_CLIST(view),8,"length ");// gtk_clist_set_column_title(GTK_CLIST(clist),9,"number");gtk_clist_column_titles_show(GTK_CLIST(view));//GtkTextBuffer *buffer;//view = gtk_text_view_new (9);//GtkTextIter iter;// bufferin = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));//bufferin=buffer;scrolled_window = gtk_scrolled_window_new (NULL, NULL);gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);gtk_container_add (GTK_CONTAINER (scrolled_window), view);/*gtk_text_buffer_get_iter_at_offset(bufferin,&iter,0);for(int i=0;i<5;i++){insert_text (bufferin,"i am your father!\n");}*/gtk_container_set_border_width(GTK_CONTAINER(scrolled_window),10);gtk_clist_set_shadow_type(view,GTK_SHADOW_ETCHED_OUT);list=view;gtk_widget_show_all (scrolled_window);return scrolled_window;//return view;
}void insert_Table(struct packet *pact){printf("1\n");struct packet packe=*pact;printf("2\n");gchar *text[9];printf("3\n");char bufx[10];sprintf(bufx,"%d",packe.seq);text[0]=bufx;printf("4\n");text[1]=packe.src_mac;text[2]=packe.des_mac;text[3]=packe.src_ip;text[4]=packe.des_ip;printf("5\n");text[5]=packe.src_port;text[6]=packe.des_port;text[7]=packe.type;text[8]="xxxx";printf("9\n");gtk_clist_append(GTK_CLIST(list),text);printf("10\n");decide2=1;}GtkWidget *create_Text2()
{GtkWidget *scrolled_window;GtkWidget *view;//GtkTextBuffer *buffer;view = gtk_text_view_new ();GtkTextIter iter;bufferin2 = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));//bufferin=buffer;scrolled_window = gtk_scrolled_window_new (NULL, NULL);gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);gtk_container_add (GTK_CONTAINER (scrolled_window), view);gtk_text_buffer_get_iter_at_offset(bufferin,&iter,0);/*for(int i=0;i<5;i++){insert_text2("ffffffffffff\n");}*/gtk_widget_show_all (scrolled_window);return scrolled_window;
}void insert_text(char* str){GtkTextIter start,end;gtk_text_buffer_get_start_iter(bufferin,&start);gtk_text_buffer_get_end_iter(bufferin,&end);// gtk_text_buffer_get_iter_at_offset(bufferin,&end,volume/2);gtk_text_buffer_delete(bufferin,&start,&end);GtkTextIter iter;gtk_text_buffer_get_iter_at_offset(bufferin,&iter,0);gtk_text_buffer_insert(bufferin,&iter,str,-1);decide=1;/*if(item>volume){clear();printf("-----------clear----------------");}*/
}void select_row_callback(GtkWidget* clist,gint row,gint column,GdkEventButton* event,gpointer data){printf("1\n");gchar* text=NULL;printf("2\n");gtk_clist_get_text(GTK_CLIST(clist),row,0,&text);printf("3\n");char* num=text;printf("4\n");int seqnum=atoi(num);printf("5\n");int off=1;if(seqnum<=TABLE_LEN){off=0;}struct packet pacd=pac_arr[seqnum/TABLE_LEN][seqnum%TABLE_LEN];printf("%d\n",pacd.seq);printf("%s\n",pacd.type);printf("%s\n",pacd.src_ip);printf("detail: \n%s\n--------------------\n",pacd.detail);printf("6\n");char mail[4096];printf("7/n");sprintf(mail,"PACKET NUM :%d \n",seqnum);printf("8/n");strcat(mail,pacd.detail);printf("9/n");insert_text(mail);}void insert_text2(char* str){GtkTextIter iter;gtk_text_buffer_get_iter_at_offset(bufferin2,&iter,0);gtk_text_buffer_insert(bufferin2,&iter,str,-1);count2=1;}
void on_check_clicked1(GtkWidget* check ,gint data){switch((int)data){case 1:Ser_Type.a=(Ser_Type.a+1)%2;break;case 2:Ser_Type.e=(Ser_Type.e+1)%2;break;case 3:Ser_Type.d=(Ser_Type.d+1)%2;break;case 4:Ser_Type.h=(Ser_Type.h+1)%2;break;default:break;}
}void on_check_clicked2(GtkWidget* check ,gint data){switch((int)data){case 1:Ser_Type.arp=(Ser_Type.arp+1)%2;break;case 2:Ser_Type.ip=(Ser_Type.ip+1)%2;break;case 3:Ser_Type.tcp=(Ser_Type.tcp+1)%2;break;case 4:Ser_Type.udp=(Ser_Type.udp+1)%2;break;case 5:Ser_Type.icmp=(Ser_Type.icmp+1)%2;break;default:break;}
}void enter_callback1(GtkWidget *widget,gpointer entry){filter.src_ip_all=gtk_entry_get_text(GTK_ENTRY(entry));//printf("%s",filter.src_ip_all);}void enter_callback2(GtkWidget *widget,gpointer entry){filter.src_ip_res=gtk_entry_get_text(GTK_ENTRY(entry));}void enter_callback3(GtkWidget *widget,gpointer entry){filter.des_ip_all=gtk_entry_get_text(GTK_ENTRY(entry));}void enter_callback4(GtkWidget *widget,gpointer entry){filter.des_ip_res=gtk_entry_get_text(GTK_ENTRY(entry));}void enter_callback5(GtkWidget *widget,gpointer entry){filter.src_port_all=gtk_entry_get_text(GTK_ENTRY(entry));}void enter_callback6(GtkWidget *widget,gpointer entry){filter.src_port_res=gtk_entry_get_text(GTK_ENTRY(entry));}void enter_callback7(GtkWidget *widget,gpointer entry){filter.des_port_all=gtk_entry_get_text(GTK_ENTRY(entry));}void enter_callback8(GtkWidget *widget,gpointer entry){filter.des_port_res=gtk_entry_get_text(GTK_ENTRY(entry));}void enter_callback9(GtkWidget *widget,gpointer entry){filter.pro_all=gtk_entry_get_text(GTK_ENTRY(entry));}void enter_callback10(GtkWidget *widget,gpointer entry){filter.pro_res=gtk_entry_get_text(GTK_ENTRY(entry));}void enter_callback11(GtkWidget *widget,gpointer entry){filter.src_mac_all=gtk_entry_get_text(GTK_ENTRY(entry));}void enter_callback12(GtkWidget *widget,gpointer entry){filter.src_mac_res=gtk_entry_get_text(GTK_ENTRY(entry));}void enter_callback13(GtkWidget *widget,gpointer entry){filter.des_mac_all=gtk_entry_get_text(GTK_ENTRY(entry));}void enter_callback14(GtkWidget *widget,gpointer entry){filter.des_mac_res=gtk_entry_get_text(GTK_ENTRY(entry));}void enter_callback15(GtkWidget *widget,gpointer entry){Ser_Type.card=gtk_entry_get_text(GTK_ENTRY(entry));}void our_thread1(GtkWidget *button){work();gdk_threads_leave();}void work(){char eth_unit[200]="Ethnerat NET Unit of MAC ADDRESS\n";char* eth_unit_buf;struct ether_header* eth;struct ether_arp* arp;struct ip* ip;struct icmp* icmp; struct tcphdr* tcp; struct udphdr* udp; int sock;int len;char buff[MAXSIZE]; char* p;char* q;printf("start");//void rece_command(char *argv[]);printf("a=%d\n",Ser_Type.a);printf("e=%d\n",Ser_Type.e);printf("d=%d\n",Ser_Type.d);printf("h=%d\n",Ser_Type.h);printf("interface is %s\n",Ser_Type.interface);printf("arp=%d\n",Ser_Type.arp);printf("ip=%d\n",Ser_Type.ip);printf("tcp=%d\n",Ser_Type.tcp);printf("udp=%d\n",Ser_Type.udp);printf("icmp=%d\n",Ser_Type.icmp);filter.src_mac_all="all";filter.des_mac_all="all";filter.src_ip_all="all";filter.des_ip_all="all";filter.pro_all="all";filter.src_port_all="all";filter.des_port_all="all";//filter.pro_res="tcp";if ((sock = socket(PF_PACKET,SOCK_PACKET, htons(ETH_P_ALL))) < 0) {perror("socket error");return(EXIT_FAILURE);}while (1) {while(count==0){// printf("hault!\n");}//filterchar*dat;char buf_port_sx[10]="null";char buf_port_dx[10]="null";printf("begin...........\n");if ((len = read(sock, buff,MAXSIZE)) < 64) {continue;}q = buff;p=q;eth = (struct ether_header*)q;q += sizeof(struct ether_header);do_eth(eth);//printf("A\n");if (ntohs(eth->ether_type) == ETHERTYPE_ARP) {do_arp(arp);//printf("B\n");arp = (struct ether_arp*)q;}else if (ntohs(eth->ether_type) == ETHERTYPE_IP) {ip = (struct ip*)q;q += (int)(ip->ip_hl) << 2;// printf("C\n");dat=q;if (ip->ip_p == IPPROTO_TCP||ip->ip_p == IPPROTO_UDP||ip->ip_p == IPPROTO_ICMP) {do_ip(ip);/*char buf_port_sx[10]={0};char buf_port_dx[10]={0};*/switch (ip->ip_p) {case IPPROTO_TCP:tcp = (struct tcphdr*)q;q += (int)(tcp->th_off) << 2;printf("D\n");pac.type="tcp";printf("E\n");//pac.src_port=// pac.des_port=sprintf(buf_port_sx,"%u",ntohs(tcp->th_sport));sprintf(buf_port_dx,"%u",ntohs(tcp->th_dport));/*pac.src_port=buf_port_sx;pac.des_port=buf_port_dx;*//*for(int i=0;i<10;i++){if(buf_port_s[i]=='\0'){break;}if(buf_port_s[i]!=' '){pac.src_port=buf_port_s+i;break;}}for(int i=0;i<10;i++){if(buf_port_d[i]=='\0'){break;}if(buf_port_d[i]!=' '){pac.des_port=buf_port_d+i;break;}}*///print_tcp(tcp);break;case IPPROTO_UDP:udp = (struct udphdr*)q;q += sizeof(struct udphdr);pac.type="udp";sprintf(buf_port_sx,"%u",ntohs(udp->uh_sport));sprintf(buf_port_dx,"%u",ntohs(udp->uh_dport));/*pac.src_port=buf_port_sx;pac.des_port=buf_port_dx;*///print_udp(udp);break;case IPPROTO_ICMP:icmp = (struct icmp*)q;q += sizeof(struct icmp);pac.type="icmp";//print_icmp(icmp);break;default:printf("δ֪\n");break;}}}printf("F\n");printf("\ndesport %s\n",pac.des_port);printf("over!........");if(filt()==0){printf("trash\n");p=q;continue;}//printf("%d",ntohs(eth->ether_type));//char* my_strstr(char const *s1, char const *s2)//MAC_num++;int mac_len=ntohs(eth->ether_type);if(mac_len<1500){MAC_short_num++;MAC_byte+=mac_len;}else{MAC_byte+=1500;}char* des_mac=mac_ntoa(eth->ether_dhost);char* src_mac=mac_ntoa(eth->ether_shost);if(strcasecmp("ff:ff:ff:ff:ff:ff", mac_ntoa(eth->ether_dhost))==0){MAC_broad_num++;}//printf("\ndes: %s\n",des_mac);//printf("src: %s\n",src_mac);if(strstr(eth_unit,des_mac)==NULL){count2=0;strcat(des_mac,"\n");g_idle_add((GSourceFunc)insert_text2,(char*)des_mac);while(count2==0){}strcat(eth_unit,des_mac);}if((ntohs(eth->ether_type) == ETHERTYPE_ARP) ){ARP_num++;}if(ntohs(eth->ether_type) == ETHERTYPE_IP){IP_num++;IP_byte+=ntohs(ip->ip_len);switch (ip->ip_p) {case IPPROTO_TCP:TCP_num++;break;case IPPROTO_UDP:UDP_num++;break;      case IPPROTO_ICMP:ICMP_num++;break;default:break;}}printf("\n2: destport %s\n",pac.des_port);//char arr[4096]="PACKET: ";//printf("......accept packet %d inedx %d.................\n",pac_num,item);//output//eth = (struct ether_header*)p;//printf("G\n");//p += sizeof(struct ether_header);//printf("H\n");//if(Ser_Type.e==1)//print_ethernet(eth);if ((ntohs(eth->ether_type) == ETHERTYPE_ARP) &&(Ser_Type.arp==1||Ser_Type.a==1)) {//printf("boom\n");//arp = (struct ether_arp*)p;//if(Ser_Type.arp==1||Ser_Type.a==1)print_arp(arp,arr);//arp = (struct ether_arp*)p;}else if (ntohs(eth->ether_type) == ETHERTYPE_IP) {//ip = (struct ip*)p;//p += (int)(ip->ip_hl) << 2;if (ip->ip_p == IPPROTO_TCP||ip->ip_p == IPPROTO_UDP||ip->ip_p == IPPROTO_ICMP) {////if(Ser_Type.ip==1||Ser_Type.a==1)//print_ip(ip);//printf("I\n");   switch (ip->ip_p) {case IPPROTO_TCP:printf("TCP\n");strcat(arr,"TCP\n");// printf("I1\n");//tcp = (struct tcphdr*)p;//printf("J1\n");printf("\n2.1 desport %s\n",pac.des_port);if(Ser_Type.e==1&&(Ser_Type.a==1||Ser_Type.tcp==1))print_ethernet(eth,arr);printf("\n2.2 desport %s\n",pac.des_port);if((Ser_Type.ip==1&&Ser_Type.tcp==1)||Ser_Type.a==1)print_ip(ip,arr);//p += (int)(tcp->th_off) << 2;printf("\n2.3 desport %s\n",pac.des_port);if(Ser_Type.a==1||Ser_Type.tcp==1){print_tcp(tcp,arr);if(Ser_Type.d==1)print_data(dat,(int)(tcp->th_off) << 2,arr);}printf("\n2.4 desport %s\n",pac.des_port);break;case IPPROTO_UDP://printf("UDP");strcat(arr,"UDP\n");//printf("I2\n");//udp = (struct udphdr*)p;//p += sizeof(struct udphdr);if(Ser_Type.e==1&&(Ser_Type.a==1||Ser_Type.udp==1))print_ethernet(eth,arr);//printf("UDP2\n");if((Ser_Type.ip==1&&Ser_Type.udp==1)||Ser_Type.a==1)print_ip(ip,arr);//printf("UDP3\n");if(Ser_Type.a==1||Ser_Type.udp==1){print_udp(udp,arr);if(Ser_Type.d==1)print_data(dat,sizeof(struct udphdr),arr);}break;case IPPROTO_ICMP:printf("ICMP\n");strcat(arr,"ICMP\n");//  printf("I3\n");//icmp = (struct icmp*)p;//p += sizeof(struct icmp);if(Ser_Type.e==1&&(Ser_Type.a==1||Ser_Type.icmp==1),arr)print_ethernet(eth,arr);if((Ser_Type.ip==1&&Ser_Type.icmp==1)||Ser_Type.a==1,arr)print_ip(ip,arr);if(Ser_Type.icmp==1||Ser_Type.a==1){print_icmp(icmp,arr);if(Ser_Type.d==1)print_data(dat,sizeof(struct icmp),arr);}break;default:printf("δ֪\n");break;}}}else{continue;}//pac.detail=arr;  pac.src_port=buf_port_sx;pac.des_port=buf_port_dx;//pac.description=arr;printf("over!........");printf("\n3 desport \n",pac.des_port);decide=0;decide2=0;item++;pac_num++;printf("\npac_num=%d\n",pac_num);if(pac_num%TABLE_LEN==0){pac_max_ptr++;//pac_max_ptr=pac_max_ptr%TABLE_NUM;}pac_arr[pac_max_ptr][pac_num%TABLE_LEN]=pac;// pac_arr[pac_max_ptr][pac_num%TABLE_LEN].detail=arr;strcpy(pac_arr[pac_max_ptr][pac_num%TABLE_LEN].detail,arr);printf("shows1:\n %s\n************************************\n",arr);/*if(Ser_Type.d==1){dat[20]='\0';strcat(arr,dat);}*///void insert_Table(struct packet packe)//g_idle_add((GSourceFunc)insert_Table,(struct packet*)&pac);pac.seq=pac_num;//g_idle_add((GSourceFunc)insert_text,(char*)arr);g_idle_add((GSourceFunc)insert_Table,(struct packet*)&pac);/*while(decide==0){}*/while(decide2==0){}}}int filt(){return filt1()&&filt2()&&filt3()&&filt4()&&filt5()&&filt6()&&filt7()&&filt8()&&filt9()&&filt10()&&filt11()&&filt12()&&filt13()&&filt14();}int filt1(){if(filter.src_mac_all==NULL)return 1;if(strstr(filter.src_mac_all,"all")!=NULL)return 1;if(strstr(filter.src_mac_all,pac.src_mac)!=NULL)return 1;printf("src_mac not allowed!\n");return 0;
}int filt2(){if(filter.des_mac_all==NULL)return 1;if(strstr(filter.des_mac_all,"all")!=NULL)return 1;if(strstr(filter.des_mac_all,pac.des_mac)!=NULL)return 1;printf("des_mac not allowed!\n");return 0;
}int filt3(){if(filter.src_ip_all==NULL)return 1;if(strstr(filter.src_ip_all,"all")!=NULL)return 1;if(strstr(filter.src_ip_all,pac.src_ip)!=NULL)return 1;printf("src_ip not allowed!\n");return 0;
}int filt4(){if(filter.des_ip_all==NULL)return 1;if(strstr(filter.des_ip_all,"all")!=NULL)return 1;// printf("%s\n",filter.des_ip_all);//printf("%s\n",pac.des_ip);if(strstr(filter.des_ip_all,pac.des_ip)!=NULL)return 1;printf("des_ip not allowed!\n");return 0;
}int filt5(){if(filter.pro_all==NULL)return 1;if(strstr(filter.pro_all,"all")!=NULL)return 1;if(strstr(filter.pro_all,pac.type)!=NULL)return 1;printf("pro not allowed!\n");return 0;
}int filt6(){if(filter.src_mac_res==NULL)return 1;if(strstr(filter.src_mac_res,"all")!=NULL){printf("all src_mac denyed!\n");return 0;}if(strstr(filter.src_mac_res,pac.src_mac)!=NULL){printf("src_mac denyed!\n");return 0;} return 1;
}int filt7(){if(filter.des_mac_res==NULL)return 1;if(strstr(filter.des_mac_res,"all")!=NULL){printf("all des_mac denyed!\n");return 0;}if(strstr(filter.des_mac_res,pac.des_mac)!=NULL){ printf("des_mac denyed!\n");return 0;} return 1;
}int filt8(){if(filter.src_ip_res==NULL)return 1;if(strstr(filter.src_ip_res,"all")!=NULL){  printf("src_ip denyed!\n");return 0;}if(strstr(filter.src_ip_res,pac.src_ip)!=NULL){printf("src_ip denyed!\n");return 0;} return 1;
}int filt9(){if(filter.des_ip_res==NULL)return 1;if(strstr(filter.des_ip_res,"all")!=NULL){printf("des_ip denyed!\n");return 0;}if(strstr(filter.des_ip_res,pac.des_ip)!=NULL){printf("des_ip denyed!\n");return 0;}return 1;
}int filt10(){if(filter.pro_res==NULL)return 1;if(strstr(filter.pro_res,"all")!=NULL){ printf("pro denyed\n");return 0;}if(strstr(filter.pro_res,pac.type)!=NULL){printf("pro denyed!\n");return 0;}return 1;
}int filt11(){if(pac.type=="icmp")return 1;if(filter.src_port_all==NULL)return 1;if(strstr(filter.src_port_all,"all")!=NULL)return 1;if(strstr(filter.src_port_all,pac.src_port)!=NULL)return 1;printf(" source prot not allowed!\n");return 0;}int filt12(){if(pac.type=="icmp")return 1;if(filter.des_port_all==NULL)return 1;if(strstr(filter.des_port_all,"all")!=NULL)return 1;if(strstr(filter.des_port_all,pac.des_port)!=NULL)return 1;printf(" destination prot not allowed!\n");return 0;}int filt13(){if(pac.type=="icmp")return 1;if(filter.src_port_res==NULL)return 1;if(strstr(filter.src_port_res,"all")!=NULL){ printf("source port denyed\n");return 0;}if(strstr(filter.src_port_res,pac.src_port)!=NULL){printf("source port denyed!\n");return 0;}return 1;}int filt14(){if(pac.type=="icmp"){printf("icmp allow\n");return 1;}if(filter.des_port_res==NULL){printf("no deny ensure\n");return 1;}printf("%s\n",filter.des_port_res);printf("%s\n",pac.des_port);if(strstr(filter.des_port_res,"all")!=NULL){ printf(" destinantion port denyed\n");return 0;}if(strstr(filter.des_port_res,pac.des_port)!=NULL){printf("destination port denyed!\n");return 0;}return 1;}void clear(){GtkTextIter start,end;gtk_text_buffer_get_start_iter(bufferin,&start);//gtk_text_buffer_get_end_iter(bufferin,&end);gtk_text_buffer_get_iter_at_offset(bufferin,&end,volume/2);gtk_text_buffer_delete(bufferin,&start,&end);item=0;}void print_data(char* index,int length,char*arr){printf("\ncontent:\n ");//char*ptr=index;strcat(arr,"\nconntent: \n");char mid[8]={0};for(int i=0;i<length;i++){printf("%02x",(unsigned char)*(index+i));sprintf(mid,"%02x",(unsigned char)*(index+i));strcat(arr,mid);if(i%4==0&&i>2){strcat(arr," ");if(i%16==0&&i>6){strcat(arr,"\n");}}}strcat(arr,"\n------------------------------------------------------------------\n");}void print_ethernet(struct ether_header* eth,char* arr) {//GtkTextIter iter;//gtk_text_buffer_get_start_iter(bufferin,&iter);//gtk_text_buffer_insert(bufferin,&iter,"ETH FRAME!\n",-1);strcat(arr ,"ETH FRAME!\n");char atr[100]={0};//g_idle_add((GSourceFunc)insert_text,(char*)arr);/*item++;if(item>volume) clear();*/int type = ntohs(eth->ether_type);//insert_text(bufferin," ETH FRAME\n");//gtk_text_buffer_insert_with_tags_by_name(bufferin,&iter,"ETH FRAME",-1,"blue_fg","lmrg",NULL);if (type <= 1500) {printf("IEEE 802.3 Ethernet Frame:\n");strcat(arr,"IEEE 802.3 Ethernet Frame:\n");}else {printf("Ethernet Frame:\n");strcat(arr,"Ethernet Frame:\n");}printf("Destination MAC Adress: %17s\n", mac_ntoa(eth->ether_dhost));sprintf(atr,"Destination MAC Adress: %17s\n", mac_ntoa(eth->ether_dhost));strcat(arr,atr);printf("Source MAC Adress: %17s\n", mac_ntoa(eth->ether_shost)); sprintf(atr,"Source MAC Adress: %17s\n", mac_ntoa(eth->ether_shost)); strcat(arr,atr);if (type < 1500) {printf("Lenht: %5u\n", type);}else {//char atr[512]={0};printf("Ethernet Type ox%04x\n", type);sprintf(atr,"Ethernet Type ox%04x\n", type);strcat(arr,atr);}//g_idle_add((GSourceFunc)insert_text,(char*)arr);
}void do_eth(struct ether_header* eth) {//pac.des_mac=mac_ntoa(eth->ether_dhost); //pac.src_mac=mac_ntoa(eth->ether_shost); strcpy(pac.des_mac,mac_ntoa(eth->ether_dhost));strcpy(pac.src_mac,mac_ntoa(eth->ether_shost));}void print_arp(struct ether_arp* arp,char* arr) {/* GtkTextIter iter;gtk_text_buffer_get_start_iter(bufferin,&iter);gtk_text_buffer_insert(bufferin,&iter,"ARP!\n",-1);*/// insert_text(bufferin,"Protocal: ARP\n");char atr[300]={0};static char* arp_operation[] = { "Undefine","(ARP Request)","(ARP Reply)","(RARP Request)","(RARP Reply)" };int op = ntohs(arp->ea_hdr.ar_op);if (op <= 0 || 5 < op) {op = 0;printf("Protocol: ARP\n");strcat(arr,"Protocol: ARP\n");printf("Hedr Type: %2u %-11s | Protocal: Ox%04x %-9sin",ntohs(arp->ea_hdr.ar_hrd),(ntohs(arp->ea_hdr.ar_hrd) == ARPHRD_ETHER) ? "(Ethernet)": "(Notther)",ntohs(arp->ea_hdr.ar_pro),(ntohs(arp->ea_hdr.ar_pro) == ETHERTYPE_IP) ? "(IP)": "(Not IP)");sprintf(atr,"Hedr Type: %2u %-11s | Protocal: Ox%04x %-9sin",ntohs(arp->ea_hdr.ar_hrd),(ntohs(arp->ea_hdr.ar_hrd) == ARPHRD_ETHER) ? "(Ethernet)": "(Notther)",ntohs(arp->ea_hdr.ar_pro),(ntohs(arp->ea_hdr.ar_pro) == ETHERTYPE_IP) ? "(IP)": "(Not IP)");strcat(arr,atr);printf("Hardlen : %3u | Addr Len : %2u | op : %4d %16s\n",arp->ea_hdr.ar_hln,arp->ea_hdr.ar_pln,ntohs(arp->ea_hdr.ar_op),arp_operation[op]); sprintf(atr,"Hardlen : %3u | Addr Len : %2u | op : %4d %16s\n",arp->ea_hdr.ar_hln,arp->ea_hdr.ar_pln,ntohs(arp->ea_hdr.ar_op),arp_operation[op]);strcat(arr,atr);printf("Source MAC Address: %17s\n", mac_ntoa(arp->arp_sha));sprintf(atr,"Source MAC Address: %17s\n", mac_ntoa(arp->arp_sha));strcat(arr,atr);printf("Source IP Address: %7s\n",inet_ntoa(*(struct in_addr*) & arp->arp_spa)); sprintf(atr,"Source IP Address: %7s\n",inet_ntoa(*(struct in_addr*) & arp->arp_spa));strcat(arr,atr);printf("Destination MAC Address: %17s\n", mac_ntoa(arp->arp_tha));sprintf(atr,"Destination MAC Address: %17s\n", mac_ntoa(arp->arp_tha));strcat(arr,atr);printf("Destination IP Adress: %7s\n", inet_ntoa(*(struct in_addr*)&arp->arp_tpa));sprintf(atr,"Destination IP Adress: %7s\n", inet_ntoa(*(struct in_addr*)&arp->arp_tpa));strcat(arr,atr);}
}void do_arp(struct ether_arp* arp) {static char* arp_operation[] = { "Undefine","(ARP Request)","(ARP Reply)","(RARP Request)","(RARP Reply)" };int op = ntohs(arp->ea_hdr.ar_op);if (op <= 0 || 5 < op) {op = 0;pac.type="arp";/*pac.src_mac=mac_ntoa(arp->arp_sha);pac.des_mac=mac_ntoa(arp->arp_tha);pac.src_ip=inet_ntoa(*(struct in_addr*) & arp->arp_spa);pac.des_ip=inet_ntoa(*(struct in_addr*)&arp->arp_tpa);*/strcpy(pac.src_mac,mac_ntoa(arp->arp_sha));strcpy(pac.des_mac,mac_ntoa(arp->arp_tha));strcpy(pac.src_ip,inet_ntoa(*(struct in_addr*) & arp->arp_spa));strcpy(pac.des_ip,inet_ntoa(*(struct in_addr*)&arp->arp_tpa));}
}void print_ip(struct ip* ip,char*arr){//GtkTextIter iter;//gtk_text_buffer_get_start_iter(bufferin,&iter);//gtk_text_buffer_insert(bufferin,&iter,"IP!\n",-1);//g_idle_add((GSourceFunc)insert_text,(char*)"IP!\n");/*item++;if(item>volume) clear();*/strcat(arr ,"Protocal: IP\n");char atr[100]={0};printf("Protocal: IP\n");strcat(arr,"Protocal: IP\n");//insert_text(bufferin,"Protoal: IP\n");printf("IV: %1u | HL:%2u | T:%8s | Total Length: %10u\n",ip->ip_v, ip->ip_hl, ip_ttoa(ip->ip_tos), ntohs(ip->ip_len));sprintf(atr,"IV: %1u | HL:%2u | T:%8s | Total Length: %10u\n",ip->ip_v, ip->ip_hl, ip_ttoa(ip->ip_tos), ntohs(ip->ip_len));strcat(arr,atr);printf("Tdentifier: %5u | FF: %3s | FO: %5u\n",ntohs(ip->ip_id), ip_ftoa(ntohs(ip->ip_off)), ntohs(ip->ip_off) & IP_OFFMASK);sprintf(atr,"Tdentifier: %5u | FF: %3s | FO: %5u\n",ntohs(ip->ip_id), ip_ftoa(ntohs(ip->ip_off)), ntohs(ip->ip_off) & IP_OFFMASK);strcat(arr,atr);printf("TTL: %3u | Pro: %3u | Head Checksum: %5u\n",ip->ip_ttl, ip->ip_p, ntohs(ip->ip_sum));sprintf(atr,"TTL: %3u | Pro: %3u | Head Checksum: %5u\n",ip->ip_ttl, ip->ip_p, ntohs(ip->ip_sum));strcat(arr,atr);printf("Source IP Address: %15s\n", inet_ntoa(*(struct in_addr*)&(ip->ip_src))); sprintf(atr,"Source IP Address: %15s\n", inet_ntoa(*(struct in_addr*)&(ip->ip_src))); strcat(arr,atr);//char atr1[100]={0};printf("Destination IP Address: %15s\n", inet_ntoa(*(struct in_addr*)&(ip->ip_dst)));sprintf(atr,"Destination IP Address: %15s\n", inet_ntoa(*(struct in_addr*)&(ip->ip_dst)));strcat(arr,atr);//g_idle_add((GSourceFunc)insert_text,(char*)arr);}void do_ip(struct ip* ip){/*pac.src_ip=inet_ntoa(*(struct in_addr*)&(ip->ip_src)); pac.des_ip=inet_ntoa(*(struct in_addr*)&(ip->ip_dst));*/strcpy(pac.src_ip,inet_ntoa(*(struct in_addr*)&(ip->ip_src)));strcpy(pac.des_ip,inet_ntoa(*(struct in_addr*)&(ip->ip_dst)));
}void print_tcp(struct tcphdr* tcp,char*arr) {/*GtkTextIter iter;gtk_text_buffer_get_start_iter(bufferin,&iter);gtk_text_buffer_insert(bufferin,&iter,"TCP!\n",-1);item++;if(item>volume) clear();*///g_idle_add((GSourceFunc)insert_text,(char*)"TCP!\n");//gtk_text_buffer_insert_with_tags_by_name(bufferin,&iter,"TCP",-1,"blue_fg","lmrg",NULL);//insert_text(bufferin,"Protocal: TCP\n");strcat(arr,"Protocol: TCP");char atr[100]={0};printf("Source Port: %5u | Destination Port: %5u\n",ntohs(tcp->th_sport), ntohs(tcp->th_dport));sprintf(atr,"Source Port: %5u | Destination Port: %5u\n",ntohs(tcp->th_sport), ntohs(tcp->th_dport));strcat(arr,atr);printf("Sequence Number : %10lu\n",(u_long)(tcp->th_seq));sprintf(atr,"Sequence Number : %10lu\n",(u_long)(tcp->th_seq));strcat(arr,atr);printf("Acknowledgement Number : %10lu\n",(u_long)(tcp->th_ack));sprintf(atr,"Acknowledgement Number : %10lu\n",(u_long)(tcp->th_ack));strcat(arr,atr);printf("Do: %2u | Reserved | F: %6s | Windows Size: %5u\n", tcp->th_off, tcp_ftoa(tcp->th_flags),ntohs(tcp->th_win));sprintf(atr,"Do: %2u | Reserved | F: %6s | Windows Size: %5u\n", tcp->th_off, tcp_ftoa(tcp->th_flags),ntohs(tcp->th_win));strcat(arr,atr);printf("Checksum: %5u | Urgent Pointer: %5u\n",ntohs(tcp->th_sum),ntohs(tcp->th_urp));sprintf(atr,"Checksum: %5u | Urgent Pointer: %5u\n",ntohs(tcp->th_sum),ntohs(tcp->th_urp));strcat(arr,atr);
}void print_udp(struct udphdr* udp,char*arr) {/*GtkTextIter iter;gtk_text_buffer_get_start_iter(bufferin,&iter);gtk_text_buffer_insert(bufferin,&iter,"UDP!\n",-1);item++;if(item>volume) clear();*///g_idle_add((GSourceFunc)insert_text ,(char*)"ETH FRAME!\n");//printf("UDP4\n");//printf("%d",sizeof(udp));char atr[256]={0};//printf("UDP5\n");printf("Source Port: %5u | Dest Port:%5u\n",ntohs(udp->uh_sport), ntohs(udp->uh_dport));sprintf(atr,"Source Port: %5u | Dest Port:%5u\n",ntohs(udp->uh_sport), ntohs(udp->uh_dport));strcat(arr,atr);printf("Length: %5u | Checksum : %5u\n", ntohs(udp->uh_ulen), udp->uh_sum);sprintf(atr,"Length: %5u | Checksum : %5u\n", ntohs(udp->uh_ulen), udp->uh_sum);strcat(arr,atr);
}void print_icmp(struct icmp* icmp,char* arr) {char atr[100]={0};printf("Protocal: ICMP\n");strcat(arr,"Protocal: ICMP\n");printf("Type: %3u | Code: %3u | Checksum: %5un",icmp->icmp_type, icmp->icmp_code, ntohs(icmp->icmp_cksum));sprintf(atr,"Type: %3u | Code: %3u | Checksum: %5un",icmp->icmp_type, icmp->icmp_code, ntohs(icmp->icmp_cksum));strcat(arr,atr);if (icmp->icmp_type == 0 || icmp->icmp_type == 8) {printf(" Identification: %5u | Sequence Num: %5u\n", ntohs(icmp->icmp_id), ntohs(icmp->icmp_seq));sprintf(atr," Identification: %5u | Sequence Num: %5u\n", ntohs(icmp->icmp_id), ntohs(icmp->icmp_seq));strcat(arr,atr);}else if (icmp->icmp_type == 3) {if (icmp->icmp_code == 4) {printf("void: %5u | Next MTU: %5u\n", ntohs(icmp->icmp_pmvoid), ntohs(icmp->icmp_nextmtu));sprintf(atr,"void: %5u | Next MTU: %5u\n", ntohs(icmp->icmp_pmvoid), ntohs(icmp->icmp_nextmtu));strcat(arr,atr);}else {printf("Unused: %10lu\n", (u_long)ntohs(icmp->icmp_void));sprintf(atr,"Unused: %10lu\n", (u_long)ntohs(icmp->icmp_void));strcat(arr,atr);}}else if (icmp->icmp_type == 5) {printf(" Router IP Address: %15s\n", inet_ntoa(*(struct in_addr*)&(icmp->icmp_gwaddr)));sprintf(atr," Router IP Address: %15s\n", inet_ntoa(*(struct in_addr*)&(icmp->icmp_gwaddr)));strcat(arr,atr);}else if (icmp->icmp_type == 11) {printf(" Unused: %10lu\n", (u_long)ntohl(icmp->icmp_void));sprintf(atr," Unused: %10lu\n", (u_long)ntohl(icmp->icmp_void));strcat(arr,atr);}
}char* mac_ntoa(u_char *d){static char str[50];sprintf(str, "%02x:%02x:%02x:%02x:%02x:%02x", d[0], d[1], d[2], d[3], d[4], d[5]);return str;
}char* ip_ttoa(int flag){static int f[] = { '1','1','1','D','T','R','C','X' };static char str[17];u_int mask = 0x80;int i;for (i = 0; i < 8; i++) {if(((flag << i) & mask) != 0) {str[i] = f[i];}else {str[i] = '0';}}str[i] = '\0'; return str;
}char* ip_ftoa(int flag) {static int f[] = { 'R','D','M' }; static char str[17];u_int mask = 0x8000;int i;for (i = 0; i < 3; i++) {if (((flag << i) & mask) != 0) {str[i] = f[i];}else {str[i] = '0';}}str[i] = '\0';return str;
}char* tcp_ftoa(int flag) {static int f[] = { 'U','A','P','R','S','F' };static char str[17];u_int mask = 1 << 5;int i;for (i = 0; i < 6; i++) {if (((flag << i) & mask) != 0) {str[i] = f[i];}else {str[i] = '0';}}str[i] = '\0'; return str;
}
void rece_command(char *argv[]){if(argv[1]==NULL){printf("no commaand\n");return;}int g=1;if(argv[g][0]=='-'&&argv[g][1]!='p'&&argv[g][1]!='i'&&argv[g]!=NULL){while(argv[g]!=NULL){if(argv[g][0]=='-'&&(argv[g][1]=='p'||argv[g][1]=='i'))break;int k=0;while(argv[g][k]!='\0'){switch (argv[g][k]){case 'a':Ser_Type.a=1;break;case 'e':Ser_Type.e=1;break;case 'd':Ser_Type.d=1;break;case 'h':Ser_Type.h=1;default:break;}k++;}g++;}}if(argv[g]==NULL){Ser_Type.card="all";Ser_Type.arp=1;Ser_Type.ip=1;Ser_Type.tcp=1;Ser_Type.udp=1;Ser_Type.icmp=1;return;}if(argv[g][0]=='-'&&argv[g][1]=='i'){Ser_Type.card=argv[g+1];    g+=2;}if(argv[g]==NULL){Ser_Type.arp=1;Ser_Type.ip=1;Ser_Type.tcp=1;Ser_Type.udp=1;Ser_Type.icmp=1;return;}if(argv[g][0]=='-'&&argv[g][1]=='p'){g++;while(argv[g]!=NULL){if(strcmp(argv[g],"arp")==0){Ser_Type.arp=1;}else{if(strcmp(argv[g],"ip")==0){Ser_Type.ip=1;}else{if(strcmp(argv[g],"tcp")==0){Ser_Type.tcp=1;}else{if(strcmp(argv[g],"udp")==0){Ser_Type.udp=1;}else{if(strcmp(argv[g],"icmp")==0){Ser_Type.icmp=1;}}}}             }g++;}}}char* my_strstr(char  *s1, char  *s2)
{   printf("tttttttttttttt");if(s1==NULL)return NULL;/*如果s2为NULL,则返回s1*/if(s2==NULL)return (char*)s1;while(*s1){/*保存每一次开始的位置,方便返回;*/char *ps1 = (char*)s1;char *ps2 = (char*)s2;while(*ps1&&*ps2&&(*ps1==*ps2)){ps1++;ps2++;}if(*ps2=='\0')return (char*)s1;if(*ps1!='\0')//检测s2有没有完整的出现在s1中;s1++;}return NULL;
}

linux下C语言抓包程序,带图形界面相关推荐

  1. linux下c语言抓包,C语言实现抓包工具

    本文使用libpcap库在linux下面开发自定义抓包工具,同学们也可以在win下编写同样的代码. 抓包的目的: 1.分析协议 2.伪造数据包 3.获取重要信息,例如用户名和密码 4.做某些攻击使用 ...

  2. linux下c语言抓包库libpcap

    安装命令:sudo apt-get install libpcap-dev 由于自己还没仔细研究过,暂时也只是想在这里留个记录,方便以后需要时使用.下面是百度百科里的例子. [cpp] view pl ...

  3. Linux系统无线网络抓包程序(分析手机WIFI MAC地址)

    前面讲述了使用tcpdump和wireshark抓WIFI包,但这只是使用工具的层面,再深一层则是自己写代码实现这个功能.本文在前面文章<Linux系统有线网络抓包程序>的基础上添加实现无 ...

  4. linux下怎么网络抓包

    Linux下面如何用tcpdump抓包 很多时候我们的系统部署在Linux系统上面,在一些情况下定位问题就需要查看各个系统之间发送数据报文是否正常,下面我就简单讲解一下如何使用tcpdump抓包 tc ...

  5. linux下最全抓包命令使用方式学习和拓展

    为什么要抓包?抓包有什么作用? 抓包的好处: 1,分析出当前服务器存在的漏洞,接口参数,防盗链,流量工具,ip伪造,参数篡改,钓鱼网站等. 抓包的作用:端到端联调,包括不限制语言的参数请求,只要走up ...

  6. linux下c语言聊天室程序,纯C语言Socket实现聊天室

    最近在学习嵌入式开发,练习C语言小项目,基本是参考别人的代码,做了些修改实现了聊天室,纯C语言编写. 想直接看源码的跳到最后. 一.练习内容 socket通信流程 管道的使用 epoll的使用 首先要 ...

  7. linux下的usb抓包方法【转】

    转自:http://blog.chinaunix.net/uid-11848011-id-4508834.html 1.配置内核使能usb monitor: make menuconfig       ...

  8. Linux系统有线网络抓包程序

    今天心血来潮,玩一玩linux抓包.思路如下: 1.使用raw socket接收网络数据: 2.先解析以太帧头,得到是IP还是ARP包: 3.再解析IP头,知道是UDP还是TCP: 4.再解析UDP. ...

  9. linux下用tcpdump抓包

    # 检查是否安装 which tcpdump # 安装 yum install -y tcpdump # tcpdump依赖于libpcap# tcpdump抓包 需要管理员权限 # 列出可以抓包的网 ...

最新文章

  1. tuple(元组)备注
  2. php mysql模糊查询数组,php – 使用数组的MySQL查询
  3. python与正则表达式(part3)--贪婪模式和非贪婪模式
  4. 循环链表解决约瑟夫环问题
  5. THEOS的第一个TWeak的成功创建
  6. vscodepython使用教程_技术教程_如何用vscode写python程序- 中国it教程网
  7. Win系统 - Devcon 启用 / 禁用设备、驱动程序
  8. AForge 拍照 GetCurrentVideoFrame().GetHbitmap 内存不足
  9. 将UCF101数据集的视频提取为帧(多线程实现)
  10. 初次接触面元法对螺旋桨的性能预报,发现之前很多学者都是用fortran进行编程进行性能预报,为什么不用matlab呢,两者的差异在哪里,建议初学者用这哪个软件呢
  11. CleanMyMac最新破解安装版
  12. cura切片操作学习
  13. 14个令人惊叹的Ionic应用程序模板
  14. Cook-Torrance/ Ward反射方程
  15. 人工智能+名片,我们看到了营销圈中的“阿尔法
  16. 台式计算机怎么加一个硬盘,台式机加装一个机械硬盘图解 但建议直接在windows下...
  17. 2020年中国企业直播营销场景案例研究报告
  18. 什么是 Tableau?
  19. Eclipse最新修改JSP字体大小设置
  20. jsp页面显示超链接的时候关于路径得问题——jsp无法实现页面跳转问题 总结

热门文章

  1. 优酷土豆联姻 视频网站格局的几大猜想
  2. Centos jenkins 插件安装失败
  3. ハーディー / 哈迪
  4. win10升级后删除自带的微软输入法
  5. 免费的兑换码Java
  6. 终于来了~微信车载版正式上线~
  7. 平时你都用什么软件做笔记?
  8. 如何用zbrush雕刻布料和褶皱
  9. 微博视频代发(流程b)
  10. 钱包:BUMO 小布口袋 APP 用户手册