tux_mind

recvfrom_debug

Dec 1st, 2014
326
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.15 KB | None | 0 0
  1. #include <netinet/in.h>
  2. #include <sys/socket.h>
  3. #include <sys/ioctl.h>
  4. #include <net/if.h>
  5. #include <pthread.h>
  6. #include <unistd.h>
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <errno.h>
  10. #include <linux/if_packet.h>
  11. #include <netinet/if_ether.h>
  12. #include <stdlib.h>
  13.  
  14. #include "nbns.h"
  15.  
  16. char running = 1;
  17.  
  18. void *sender(void *arg) {
  19.   int sockfd;
  20.   struct sockaddr_in addr;
  21.  
  22.   sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  23.  
  24.   memset(&addr, 0, sizeof(addr));
  25.  
  26.   addr.sin_family = AF_INET;
  27.   addr.sin_port = htons(137);
  28.   addr.sin_addr.s_addr = htonl(0xC0A80001); // 192.168.0.1
  29.  
  30.   connect(sockfd, (struct sockaddr *) &addr, sizeof(addr));
  31.  
  32.   while(running) {
  33.     write(sockfd, nbns_nbstat_request, NBNS_NBSTATREQ_LEN);
  34.     usleep(10);
  35.   }
  36.  
  37.   sendto(sockfd, nbns_nbstat_request, NBNS_NBSTATREQ_LEN, 0, (struct sockaddr *) &addr, sizeof(addr));
  38.  
  39.   return NULL;
  40. }
  41.  
  42. void stop(int signal) {
  43.   running = 0;
  44. }
  45.  
  46. static int
  47. iface_get_id(const char *device)
  48. {
  49.   struct ifreq  ifr;
  50.   int fd;
  51.  
  52.   // this is the main difference from pcap:
  53.   // we use another socket for perform ioctl interrogations
  54.   fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
  55.  
  56.   memset(&ifr, 0, sizeof(ifr));
  57.   strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name));
  58.  
  59.   if (ioctl(fd, SIOCGIFINDEX, &ifr) == -1) {
  60.     fprintf(stderr, "SIOCGIFINDEX: %s\n", strerror(errno));
  61.     close(fd);
  62.     return -1;
  63.   }
  64.   close(fd);
  65.  
  66.   return ifr.ifr_ifindex;
  67. }
  68.  
  69. void *receiver(void *arg) {
  70.   int sockfd;
  71.   int ifindex;
  72.   struct sockaddr_ll  sll;
  73.   int     err;
  74.   socklen_t   errlen = sizeof(err);
  75.   socklen_t   fromlen;
  76.   size_t packet_len;
  77.   char buffer[1514];
  78.  
  79.   /* pcap_open_live */
  80.  
  81.   sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
  82.  
  83.   ifindex = iface_get_id((char *) arg);
  84.  
  85.   if(ifindex==-1) return NULL;
  86.  
  87.   memset(&sll, 0, sizeof(sll));
  88.   sll.sll_family    = AF_PACKET;
  89.   sll.sll_ifindex   = ifindex;
  90.   sll.sll_protocol  = htons(ETH_P_ALL);
  91.  
  92.   if (bind(sockfd, (struct sockaddr *) &sll, sizeof(sll)) == -1) {
  93.     fprintf(stderr, "bind: %s\n", strerror(errno));
  94.     return NULL;
  95.   }
  96.  
  97.   /* Any pending errors, e.g., network is down? */
  98.  
  99.   if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &err, &errlen) == -1) {
  100.     fprintf(stderr, "getsockopt: %s\n", strerror(errno));
  101.     return NULL;
  102.   }
  103.  
  104.   if (err > 0) {
  105.     fprintf(stderr, "bind: %s\n", strerror(err));
  106.     return NULL;
  107.   }
  108.  
  109.   /* pcap_open_live ends */
  110.  
  111.   /* pcap_loop */
  112.  
  113.   fromlen = sizeof(sll);
  114.  
  115.   while(running) {
  116.  
  117.     do {
  118.       packet_len = recvfrom(sockfd, buffer, 1514, MSG_TRUNC,
  119.                             (struct sockaddr *) &sll, &fromlen);
  120.     } while(running && packet_len == -1 && (errno == EINTR || errno == EAGAIN));
  121.    
  122.     if(running && packet_len == -1) {
  123.       fprintf(stderr, "recvfrom: %s\n", strerror(errno));
  124.       return NULL;
  125.     }
  126.    
  127.     if(packet_len > 14) {
  128.       fprintf(stderr, "sll: { sll_family=%d, sll_protocol=%d, sll_ifindex=%d, sll_hatype=%d, sll_pkttype=%d, sll_halen=%d, sll_addr=[%02hhX:%02hhX:%02hhX:%02hhX:%02hhX:%02hhX:%02hhX:%02hhX] }\n",
  129.               sll.sll_family, sll.sll_protocol, sll.sll_ifindex, sll.sll_hatype,
  130.               sll.sll_pkttype, sll.sll_halen, sll.sll_addr[0], sll.sll_addr[1],
  131.               sll.sll_addr[2], sll.sll_addr[3], sll.sll_addr[4], sll.sll_addr[5],
  132.               sll.sll_addr[6], sll.sll_addr[7]);
  133.      
  134.      
  135.       fprintf(stderr, "%02hhX:%02hhX:%02hhX:%02hhX:%02hhX:%02hhX => %02hhX:%02hhX:%02hhX:%02hhX:%02hhX:%02hhX\n",
  136.               buffer[6], buffer[7], buffer[8], buffer[9], buffer[10], buffer[11],
  137.               buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5]);
  138.       fflush(stderr);
  139.     }
  140.    
  141.   }
  142.  
  143.   /* pcap_loop ends */
  144.  
  145.   close(sockfd);
  146.  
  147.   return NULL;
  148. }
  149.  
  150. int main(int argc, char **argv) {
  151.   pthread_t tid;
  152.  
  153.   if(argc != 2) return 1;
  154.  
  155.   if(signal(SIGINT, stop) == SIG_ERR) return 2;
  156.  
  157.   if(pthread_create(&tid, NULL, receiver, (void *) argv[1])) {
  158.     return 6;
  159.   }
  160.  
  161.   sender((char *) argv[1]);
  162.  
  163.   running=0;
  164.  
  165.   pthread_join(tid, NULL);
  166.  
  167.   exit(0); // close all unclear stuff [ hey, is a test program ;) ]
  168. }
Advertisement
Add Comment
Please, Sign In to add comment