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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* Transport header checksum
  2.  * for TCP and UDP
  3.  * 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. #include <netinet/ip.h>
  13. #include <netinet/udp.h>
  14. #include <netinet/tcp.h>
  15. #include <errno.h>
  16. #include <string.h>
  17. #if !defined(HAVE_INCKSUM)
  18. #include <checksum.h>
  19. #endif
  20. struct psuedohdr  {
  21.   struct in_addr source_address;
  22.   struct in_addr dest_address;
  23.   unsigned char place_holder;
  24.   unsigned char protocol;
  25.   unsigned short length;
  26. } psuedohdr;
  27. unsigned short trans_check(unsigned char proto,
  28.    char *packet,
  29.    int length,
  30.    struct in_addr source_address,
  31.    struct in_addr dest_address)
  32. {
  33.   char *psuedo_packet;
  34.   unsigned short answer;
  35.   
  36.   psuedohdr.protocol = proto;
  37.   psuedohdr.length = htons(length);
  38.   psuedohdr.place_holder = 0;
  39.   psuedohdr.source_address = source_address;
  40.   psuedohdr.dest_address = dest_address;
  41.   
  42.   if((psuedo_packet = malloc(sizeof(psuedohdr) + length)) == NULL)  {
  43.     perror("malloc");
  44.     exit(1);
  45.   }
  46.   
  47.   memcpy(psuedo_packet,&psuedohdr,sizeof(psuedohdr));
  48.   memcpy((psuedo_packet + sizeof(psuedohdr)),
  49.  packet,length);
  50.   
  51.   answer = (unsigned short)in_cksum((unsigned short *)psuedo_packet,
  52.     (length + sizeof(psuedohdr)));
  53.   free(psuedo_packet);
  54.   return answer;
  55. }