udp.c
上传用户:bobuwen
上传日期:2007-01-07
资源大小:10k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* Write a udp packet and send it through
  2.  * a raw socket.
  3.  * Thamer Al-Herbish shadows@whitefang.com
  4.  */
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <sys/types.h>
  8. #include <sys/socket.h>
  9. #include <netinet/in.h>
  10. #include <arpa/inet.h>
  11. #include <netinet/in_systm.h>
  12. #if defined(LINUX)
  13. #include <linux/ip.h>
  14. #include <linux/udp.h>
  15. #else
  16. #include <netinet/ip.h>
  17. #include <netinet/udp.h>
  18. #endif
  19. #if defined(SOLARIS_CKSUM_BUG)
  20. #include <netinet/tcp.h>
  21. #endif
  22. #include <rawsock_utils.h>
  23. #include <string.h>
  24. #define MESG_LENGTH 12
  25. int main(int argc,char *argv[])
  26. {
  27.   unsigned char packet[
  28. #if !defined(LINUX)
  29.   sizeof(struct ip) +
  30. #else /* LINUX */
  31.   sizeof(struct iphdr) +
  32. #endif /* LINUX */
  33.               sizeof(struct udphdr) + 
  34.               MESG_LENGTH];
  35.   struct in_addr saddr, daddr;
  36.   unsigned short sport, dport;
  37.   struct sockaddr_in mysocket;
  38.   struct udphdr *udphdr;
  39.   int sockd, on = 1;
  40.   
  41.   if(argc < 5)  {
  42.     fprintf(stderr,"usage: %s source_port source_address dest_port dest_addressn",
  43.     argv[0]);
  44.     exit(1);
  45.   }
  46.   
  47.   sport = (unsigned short)atoi(argv[1]);
  48.   saddr.s_addr = inet_addr(argv[2]);
  49.   dport = (unsigned short)atoi(argv[3]);
  50.   daddr.s_addr = inet_addr(argv[4]);
  51.   
  52.   if((sockd = socket(AF_INET,SOCK_RAW,IPPROTO_RAW)) < 0)  {
  53.     perror("socket");
  54.     exit(1);
  55.   }
  56.   
  57.   if(setsockopt(sockd,IPPROTO_IP,IP_HDRINCL,(char *)&on,sizeof(on)) < 0)  {
  58.     perror("setsockopt");
  59.     exit(1);
  60.   }
  61.   
  62.   ip_gen(packet,IPPROTO_UDP,saddr,daddr,sizeof(packet));
  63. #if !defined(LINUX)
  64.   udphdr = (struct udphdr *)(packet + sizeof(struct ip));
  65.   memset((packet+sizeof(struct udphdr)+sizeof(struct ip)),
  66.  0,MESG_LENGTH);  /* Just zero out the message content. */
  67.   udp_gen((char *)udphdr,sport,dport,(sizeof(struct udphdr) + MESG_LENGTH));
  68. #if !defined(SOLARIS_CKSUM_BUG)
  69.   udphdr->uh_sum = trans_check(IPPROTO_UDP,(char *)udphdr,
  70.        (MESG_LENGTH + sizeof(struct udphdr)),
  71.        saddr,
  72.        daddr);
  73. #else /* SOLARIS_CKSUM_BUG */
  74.   udphdr->uh_sum = sizeof(struct tcphdr);
  75. #endif /* SOLARIS_CKSUM_BUG */
  76. #else /* LINUX */
  77.   udphdr = (struct udphdr *)(packet + sizeof(struct iphdr));
  78.   memset((packet+sizeof(struct udphdr)+sizeof(struct iphdr)),
  79.  '0',MESG_LENGTH);  /* Just zero out the message content. */
  80.   udp_gen((char *)udphdr,sport,dport,(sizeof(struct udphdr) + MESG_LENGTH));
  81. #if !defined(SOLARIS_CKSUM_BUG)
  82.   udphdr->check = trans_check(IPPROTO_UDP,(char *)udphdr,
  83.       (MESG_LENGTH + sizeof(struct udphdr)),
  84.       saddr,
  85.       daddr);
  86. #else /* SOLARIS_CKSUM_BUG */
  87.   udphdr->check = sizeof(struct tcphdr);
  88. #endif /* SOLARIS_CKSUM_BUG */
  89. #endif /* LINUX */
  90.   
  91.   memset(&mysocket,'',sizeof(mysocket));
  92.   
  93.   mysocket.sin_family = AF_INET;
  94.   mysocket.sin_port = htons(dport);
  95.   mysocket.sin_addr = daddr;
  96.   
  97.   if(sendto(sockd,&packet,sizeof(packet),0x0,(struct sockaddr *)&mysocket,
  98.     sizeof(mysocket)) != sizeof(packet))  {
  99.     perror("sendto");
  100.     exit(1);
  101.   }
  102.   
  103.   exit(0);
  104. }