send_arp.c
上传用户:bilang918
上传日期:2010-03-24
资源大小:558k
文件大小:4k
源码类别:

网络

开发平台:

Unix_Linux

  1. /*
  2. This program sends out one ARP packet with source/target IP
  3. and Ethernet hardware addresses suuplied by the user. It 
  4. compiles and works on Linux and will probably work on any 
  5. Unix that has SOCK_PACKET. volobuev@t1.chem.umn.edu 
  6. 运行方法./send_arp my_ip my_eth_addr network_ip broadcast_eth_addr
  7. 如本机ip为192.168.0.1,eth_addr 为 10:24:26:97:00:21
  8. 则运行 ./send_arp 192.168.0.1   10:24:26:97:00:21 192.168.0.255 ff:ff:ff:ff:ff:ff
  9. */ 
  10. #include <netdb.h>
  11. #include <sys/socket.h>
  12. #include <sys/types.h>
  13. #include <stdio.h>
  14. #include <errno.h>
  15. #include <sys/ioctl.h>
  16. #include <net/if.h>
  17. #include <signal.h>
  18. #include <netinet/ip.h>
  19. #include <netinet/in.h>
  20. #include <string.h>
  21. #include <arpa/inet.h>
  22. #include <netinet/ip_icmp.h>
  23. #include <linux/if_ether.h>
  24. #define ETH_HW_ADDR_LEN 6 
  25. #define IP_ADDR_LEN 4 
  26. #define ARP_FRAME_TYPE 0x0806 
  27. #define ETHER_HW_TYPE 1 
  28. #define IP_PROTO_TYPE 0x0800 
  29. #define OP_ARP_REQUEST 2 
  30. #define OP_ARP_QUEST 1
  31. #define DEFAULT_DEVICE "eth0" 
  32. char usage[] = {"send_arp: sends out custom ARP packet. yuri volobuev
  33. usage: send_arp src_ip_addr src_hw_addr targ_ip_addr tar_hw_addr number"}; 
  34. struct arp_packet 
  35. u_char targ_hw_addr[ETH_HW_ADDR_LEN]; 
  36. u_char src_hw_addr[ETH_HW_ADDR_LEN]; 
  37. u_short frame_type; 
  38. u_short hw_type; 
  39. u_short prot_type; 
  40. u_char hw_addr_size; 
  41. u_char prot_addr_size; 
  42. u_short op; 
  43. u_char sndr_hw_addr[ETH_HW_ADDR_LEN]; 
  44. u_char sndr_ip_addr[IP_ADDR_LEN]; 
  45. u_char rcpt_hw_addr[ETH_HW_ADDR_LEN]; 
  46. u_char rcpt_ip_addr[IP_ADDR_LEN]; 
  47. u_char padding[18]; 
  48. }; 
  49. void die (char *); 
  50. void get_ip_addr (struct in_addr *, char *); 
  51. void get_hw_addr (char *, char *); 
  52. int main (int argc, char * argv[]) 
  53. struct in_addr src_in_addr, targ_in_addr; 
  54. struct arp_packet pkt; 
  55. struct sockaddr sa; 
  56. int sock; 
  57. int j,number;
  58. if (argc != 6) 
  59. die(usage); 
  60. sock = socket(AF_INET, SOCK_PACKET, htons(ETH_P_RARP)); 
  61. if (sock < 0) 
  62. perror("socket"); 
  63. exit(1); 
  64. number=atoi(argv[5]);
  65. pkt.frame_type = htons(ARP_FRAME_TYPE); 
  66. pkt.hw_type = htons(ETHER_HW_TYPE); 
  67. pkt.prot_type = htons(IP_PROTO_TYPE); 
  68. pkt.hw_addr_size = ETH_HW_ADDR_LEN; 
  69. pkt.prot_addr_size = IP_ADDR_LEN; 
  70. pkt.op = htons(OP_ARP_QUEST); 
  71. get_hw_addr(pkt.targ_hw_addr, argv[4]); 
  72. get_hw_addr(pkt.rcpt_hw_addr, argv[4]); 
  73. get_hw_addr(pkt.src_hw_addr, argv[2]); 
  74. get_hw_addr(pkt.sndr_hw_addr, argv[2]); 
  75. get_ip_addr(&src_in_addr, argv[1]); 
  76. get_ip_addr(&targ_in_addr, argv[3]); 
  77. memcpy(pkt.sndr_ip_addr, &src_in_addr, IP_ADDR_LEN); 
  78. memcpy(pkt.rcpt_ip_addr, &targ_in_addr, IP_ADDR_LEN); 
  79. bzero(pkt.padding,18); 
  80. strcpy(sa.sa_data,DEFAULT_DEVICE); 
  81. for (j=0;j<number;j++)
  82. {
  83. if (sendto(sock,&pkt,sizeof(pkt),0,&sa,sizeof(sa)) < 0) 
  84. perror("sendto"); 
  85. exit(1); 
  86. }
  87. exit(0); 
  88. void die (char *str) 
  89. fprintf(stderr,"%sn",str); 
  90. exit(1); 
  91. void get_ip_addr (struct in_addr *in_addr, char *str) 
  92. struct hostent *hostp; 
  93. in_addr->s_addr = inet_addr(str); 
  94. if(in_addr->s_addr == -1)
  95. if ((hostp = gethostbyname(str))) 
  96. bcopy(hostp->h_addr, in_addr, hostp->h_length); 
  97. else { 
  98. fprintf(stderr, "send_arp: unknown host %sn", str); 
  99. exit(1); 
  100. void get_hw_addr (char *buf, char *str) 
  101. int i; 
  102. char c, val; 
  103. for(i = 0; i < ETH_HW_ADDR_LEN; i++) 
  104. if (!(c = tolower(*str++))) 
  105. die("Invalid hardware address"); 
  106. if (isdigit(c)) 
  107. val = c - '0'; 
  108. else if (c >= 'a' && c <= 'f') 
  109. val = c-'a'+10; 
  110. else 
  111. die("Invalid hardware address"); 
  112. *buf = val << 4; 
  113. if (!(c = tolower(*str++))) 
  114. die("Invalid hardware address"); 
  115. if (isdigit(c)) 
  116. val = c - '0'; 
  117. else if (c >= 'a' && c <= 'f') 
  118. val = c-'a'+10; 
  119. else 
  120. die("Invalid hardware address"); 
  121. *buf++ |= val; 
  122. if (*str == ':') 
  123. str++; 
  124. }
  125.