linux下C语言抓包程序,带图形界面

用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 page
    GtkWidget *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);
    
    
    
    
    //check
    GtkWidget*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);
    
    //entry
    GtkWidget *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 window
    
    GtkWidget* text=create_Text();
    
    gtk_fixed_put(GTK_FIXED(box),text,450,400);
    gtk_widget_set_size_request(text,500,450); 
    //List
    GtkWidget *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 button
    GtkWidget *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 button
    GtkWidget *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 button
    GtkWidget *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 button
    GtkWidget *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 page
    label=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);
    
    //entry
    
    entry1=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 page
    label=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");
	    }
	   //filter
        char*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;
}



  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值