Advertisement
tux_mind

pcaptest

Dec 1st, 2014
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.17 KB | None | 0 0
  1. #include <pcap.h>
  2. #include <netinet/in.h>
  3. #include <sys/socket.h>
  4. #include <pthread.h>
  5. #include <unistd.h>
  6.  
  7. #include "nbns.h"
  8.  
  9. char running = 1;
  10. pcap_t *handle;
  11.  
  12. void *sender(void *arg) {
  13.   int sockfd;
  14.   struct sockaddr_in addr;
  15.  
  16.   sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  17.  
  18.   memset(&addr, 0, sizeof(addr));
  19.  
  20.   addr.sin_family = AF_INET;
  21.   addr.sin_port = htons(137);
  22.   addr.sin_addr.s_addr = htonl(0xC0A80001); // 192.168.0.1
  23.  
  24.   connect(sockfd, (struct sockaddr *) &addr, sizeof(addr));
  25.  
  26.   while(running) {
  27.     write(sockfd, nbns_nbstat_request, NBNS_NBSTATREQ_LEN);
  28.     usleep(10);
  29.   }
  30.  
  31.   sendto(sockfd, nbns_nbstat_request, NBNS_NBSTATREQ_LEN, 0, (struct sockaddr *) &addr, sizeof(addr));
  32.  
  33.   return NULL;
  34. }
  35.  
  36. void stop(int signal) {
  37.   //pcap_breakloop(handle);
  38.   running = 0;
  39. }
  40.  
  41. void pcap_callback(u_char *user, const struct pcap_pkthdr *h, const u_char *bytes) {
  42.   if(!running) {
  43.     pcap_breakloop(handle);
  44.   }
  45. }
  46.  
  47. void *receiver(void *arg) {
  48.   int ret;
  49.   struct bpf_program filter;
  50.   char err_buff[PCAP_ERRBUF_SIZE];
  51.  
  52.   handle = pcap_open_live((char *) arg, 0x40000, 0, 1000, err_buff);
  53.  
  54.   if(!handle) {
  55.     fprintf(stderr, "pcap_open_live: %s", err_buff);
  56.     running = 0;
  57.     return NULL;
  58.   }
  59.  
  60.   if(pcap_compile(handle, &filter, "udp and port 137", 1, 0xffffff00)) {
  61.     fprintf( stderr, "pcap_compile: %s", pcap_geterr(handle));
  62.     pcap_close(handle);
  63.     running = 0;
  64.     return NULL;
  65.   }
  66.  
  67.   if(pcap_setfilter(handle, &filter)) {
  68.     fprintf( stderr, "pcap_setfilter: %s", pcap_geterr(handle));
  69.     pcap_close(handle);
  70.     running = 0;
  71.     return NULL;
  72.   }
  73.  
  74.   ret = pcap_loop(handle, -1, pcap_callback, NULL);
  75.  
  76.   return (void *) ret;
  77. }
  78.  
  79. int main(int argc, char **argv) {
  80.   pthread_t tid;
  81.   int ret;
  82.  
  83.   if(argc != 2) return 1;
  84.  
  85.   if(signal(SIGINT, stop) == SIG_ERR) return 2;
  86.  
  87.   if(pthread_create(&tid, NULL, receiver, (void *) argv[1])) {
  88.     pcap_close(handle);
  89.     return 6;
  90.   }
  91.  
  92.   sender(NULL);
  93.  
  94.   running=0;
  95.  
  96.   pthread_join(tid, (void **) &ret);
  97.  
  98.   if(ret == -1) {
  99.     fprintf(stderr, "pcap_loop: %s\n", pcap_geterr(handle));
  100.     return 7;
  101.   }
  102.  
  103.   return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement