/************************************************************************* > File Name : demo2.c > Author : TL Song > EMail : songtianlun@frytea.com > Created Time : Thu Feb 18 20:31:49 2021 ************************************************************************/ #include #include #include #include #define SNAP_LEN 65536 #define dPrint(fmt, ...) do{fprintf(stderr, "[%s:%d] " fmt "\r\n", __FUNCTION__, __LINE__, ##__VA_ARGS__);}while(0) #define HexPrint(_buf, _len) \ {\ int _m_i = 0;\ char *_m_buf = (char *)(_buf);\ int _m_len = (int)(_len);\ printf("[%s:%d] \r\n", __FUNCTION__, __LINE__);\ printf("*****************************\n");\ for(_m_i = 0; _m_i < _m_len; _m_i++)\ {\ printf("\033[32m%02x \033[0m", _m_buf[_m_i] & 0xff);\ if(!((_m_i+1) % 10)) printf("\n");\ }\ printf("\nsize = %d\n*****************************\n", _m_len);\ } int send_pkt_pcap(const u_char *pkt, int len) { static pcap_t *handle = NULL; char dev_str[64]; char err_buf[PCAP_ERRBUF_SIZE]; strcpy(dev_str, "eth1"); if(NULL == handle) { handle = pcap_open_live(dev_str, SNAP_LEN, 1, 1000, err_buf); if (handle == NULL) { fprintf(stderr, "Couldn't open device %s: %s\n", dev_str, err_buf); return 0; } } return pcap_sendpacket(handle, pkt, len); } void dispatcher_handler(u_char *temp1, const struct pcap_pkthdr *header, const u_char *pkt_data) { HexPrint((const char *)pkt_data, header->caplen); u_char pkt_send[header->caplen]; memset(pkt_send, 0x00, sizeof(pkt_send)); memcpy(pkt_send, pkt_data, header->caplen); HexPrint((const char *)pkt_send, sizeof(pkt_send)); dPrint("Send ret : %d", send_pkt_pcap((const u_char *)pkt_send, sizeof(pkt_send))); } int main(int argc, char *argv[]) { char *dev, errbuf[PCAP_ERRBUF_SIZE]; struct bpf_program fp; /* The compiled filter expression */ char filter_exp[] = "vlan and src host 192.168.1.123"; /* The filter expression (filter 53 port)*/ pcap_t *handle; bpf_u_int32 mask; /* The netmask of our sniffing device */ bpf_u_int32 net; /* The IP of our sniffing device */ dev = pcap_lookupdev(errbuf); if (dev == NULL) { fprintf(stderr, "Couldn't find default device: %s\n", errbuf); return(2); } printf("Device: %s\n", dev); /*get network mask*/ if (pcap_lookupnet(dev, &net, &mask, errbuf) == -1) { fprintf(stderr, "Can't get netmask for device %s\n", dev); net = 0; mask = 0; } /*Open the session in promiscuous mode*/ handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf); if (handle == NULL) { fprintf(stderr, "Couldn't open device %s: %s\n", dev, errbuf); return(2); } /* Compile and apply the filter */ if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) { fprintf(stderr, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle)); return(2); } if (pcap_setfilter(handle, &fp) == -1) { fprintf(stderr, "Couldn't install filter %s: %s\n", filter_exp, pcap_geterr(handle)); return(2); } pcap_loop(handle, -1, dispatcher_handler, NULL); /* cleanup */ pcap_freecode(&fp); pcap_close(handle); dPrint("Capture complete."); return(0); }