CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
英特尔®游戏设计大赛100美元现金周周送 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  网络编程

(求助!)raw socket 编程技巧!

楼主df8327(DF)2003-12-02 02:46:14 在 VC/MFC / 网络编程 提问

想实现IP成数据包的访问,还有数据包简单的转发,不知道怎么搞,去网上搜索了一个例子(如下)无论使用vc6还是vs.net都会报链接错误,不知道是我配置的问题还是什么,请各位高手不吝赐教!  
  源代码:  
   
  #include   <stdio.h>    
  #include   <winsock2.h>    
  #include   <ws2tcpip.h>    
   
  #define   SOURCE_PORT   7234    
  #define   MAX_RECEIVEBYTE   255    
   
  typedef   struct   ip_hdr   //定义IP首部    
  {    
  unsigned   char   h_verlen;   //4位首部长度,4位IP版本号    
  unsigned   char   tos;   //8位服务类型TOS    
  unsigned   short   total_len;   //16位总长度(字节)    
  unsigned   short   ident;   //16位标识    
  unsigned   short   frag_and_flags;   //3位标志位    
  unsigned   char   ttl;   //8位生存时间   TTL    
  unsigned   char   proto;   //8位协议   (TCP,   UDP   或其他)    
  unsigned   short   checksum;   //16位IP首部校验和    
  unsigned   int   sourceIP;   //32位源IP地址    
  unsigned   int   destIP;   //32位目的IP地址    
  }IPHEADER;    
   
  typedef   struct   tsd_hdr   //定义TCP伪首部    
  {    
  unsigned   long   saddr;   //源地址    
  unsigned   long   daddr;   //目的地址    
  char   mbz;    
  char   ptcl;   //协议类型    
  unsigned   short   tcpl;   //TCP长度    
  }PSDHEADER;    
   
  typedef   struct   tcp_hdr   //定义TCP首部    
  {    
  USHORT   th_sport;   //16位源端口    
  USHORT   th_dport;   //16位目的端口    
  unsigned   int   th_seq;   //32位序列号    
  unsigned   int   th_ack;   //32位确认号    
  unsigned   char   th_lenres;   //4位首部长度/6位保留字    
  unsigned   char   th_flag;   //6位标志位    
  USHORT   th_win;   //16位窗口大小    
  USHORT   th_sum;   //16位校验和    
  USHORT   th_urp;   //16位紧急数据偏移量    
  }TCPHEADER;    
   
  //CheckSum:计算校验和的子函数    
  USHORT   checksum(USHORT   *buffer,   int   size)    
  {    
  unsigned   long   cksum=0;    
  while(size   >1)    
  {    
  cksum+=*buffer++;    
  size   -=sizeof(USHORT);    
  }    
  if(size   )    
  {    
  cksum   +=   *(UCHAR*)buffer;    
  }    
   
  cksum   =   (cksum   >>   16)   +   (cksum   &   0xffff);    
  cksum   +=   (cksum   >>16);    
  return   (USHORT)(~cksum);    
  }    
   
  void   useage()    
  {    
  printf("******************************************\n");    
  printf("TCPPing\n");    
  printf("\t   Written   by   Refdom\n");    
  printf("\t   Email:   refdom@263.net\n");    
  printf("Useage:   TCPPing.exe   Target_ip   Target_port   \n");    
  printf("*******************************************\n");    
  }    
   
  int   main(int   argc,   char*   argv[])    
  {    
  WSADATA   WSAData;    
  SOCKET   sock;    
  SOCKADDR_IN   addr_in;    
  IPHEADER   ipHeader;    
  TCPHEADER   tcpHeader;    
  PSDHEADER   psdHeader;    
   
  char   szSendBuf[60]={0};    
  BOOL   flag;    
  int   rect,nTimeOver;    
   
  useage();    
   
  if   (argc!=   3)    
  {   return   false;   }    
   
  if   (WSAStartup(MAKEWORD(2,2),   &WSAData)!=0)    
  {    
  printf("WSAStartup   Error!\n");    
  return   false;    
  }    
   
  if   ((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET)    
  {    
  printf("Socket   Setup   Error!\n");    
  return   false;    
  }    
  flag=true;    
  if   (setsockopt(sock,IPPROTO_IP,   IP_HDRINCL,(char   *)&flag,sizeof(flag))==SOCKET_ERROR)    
  {    
  printf("setsockopt   IP_HDRINCL   error!\n");    
  return   false;    
  }    
   
  nTimeOver=1000;    
  if   (setsockopt(sock,   SOL_SOCKET,   SO_SNDTIMEO,   (char*)&nTimeOver,   sizeof(nTimeOver))==SOCKET_ERROR)    
  {    
  printf("setsockopt   SO_SNDTIMEO   error!\n");    
  return   false;    
  }    
  addr_in.sin_family=AF_INET;    
  addr_in.sin_port=htons(atoi(argv[2]));    
  addr_in.sin_addr.S_un.S_addr=inet_addr(argv[1]);    
   
  //    
  //    
  //填充IP首部    
  ipHeader.h_verlen=(4<<4   |   sizeof(ipHeader)/sizeof(unsigned   long));    
  //   ipHeader.tos=0;    
  ipHeader.total_len=htons(sizeof(ipHeader)+sizeof(tcpHeader));    
  ipHeader.ident=1;    
  ipHeader.frag_and_flags=0;    
  ipHeader.ttl=128;    
  ipHeader.proto=IPPROTO_TCP;    
  ipHeader.checksum=0;    
  ipHeader.sourceIP=inet_addr("本地地址");    
  ipHeader.destIP=inet_addr(argv[1]);    
   
  //填充TCP首部    
  tcpHeader.th_dport=htons(atoi(argv[2]));    
  tcpHeader.th_sport=htons(SOURCE_PORT);   //源端口号    
  tcpHeader.th_seq=htonl(0x12345678);    
  tcpHeader.th_ack=0;    
  tcpHeader.th_lenres=(sizeof(tcpHeader)/4<<4|0);    
  tcpHeader.th_flag=2;   //修改这里来实现不同的标志位探测,2是SYN,1是FIN,16是ACK探测   等等    
  tcpHeader.th_win=htons(512);    
  tcpHeader.th_urp=0;    
  tcpHeader.th_sum=0;    
   
  psdHeader.saddr=ipHeader.sourceIP;    
  psdHeader.daddr=ipHeader.destIP;    
  psdHeader.mbz=0;    
  psdHeader.ptcl=IPPROTO_TCP;    
  psdHeader.tcpl=htons(sizeof(tcpHeader));    
   
  //计算校验和    
  memcpy(szSendBuf,   &psdHeader,   sizeof(psdHeader));    
  memcpy(szSendBuf+sizeof(psdHeader),   &tcpHeader,   sizeof(tcpHeader));    
  tcpHeader.th_sum=checksum((USHORT   *)szSendBuf,sizeof(psdHeader)+sizeof(tcpHeader));    
   
  memcpy(szSendBuf,   &ipHeader,   sizeof(ipHeader));    
  memcpy(szSendBuf+sizeof(ipHeader),   &tcpHeader,   sizeof(tcpHeader));    
  memset(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader),   0,   4);    
  ipHeader.checksum=checksum((USHORT   *)szSendBuf,   sizeof(ipHeader)+sizeof(tcpHeader));    
   
  memcpy(szSendBuf,   &ipHeader,   sizeof(ipHeader));    
   
  rect=sendto(sock,   szSendBuf,   sizeof(ipHeader)+sizeof(tcpHeader),    
  0,   (struct   sockaddr*)&addr_in,   sizeof(addr_in));    
  if   (rect==SOCKET_ERROR)    
  {    
  printf("send   error!:%d\n",WSAGetLastError());    
  return   false;    
  }    
  else    
  printf("send   ok!\n");    
   
  closesocket(sock);    
  WSACleanup();    
   
  return   0;    
  }    
  问题点数:40、回复次数:4Top

1 楼zhaolaoxin()回复于 2003-12-02 09:02:39 得分 0

gzTop

2 楼mfc168(子非鱼)回复于 2003-12-02 09:03:25 得分 40

报的错误是什么?  
  是否包含了静态库   Ws2_32.libTop

3 楼tohigh(岁月的童话.NET)回复于 2003-12-02 10:47:49 得分 0

#pragma   comment(lib,"WS2_32.lib")  
  #pragma   comment(lib,"ws2tcpip.lib")  
  包含了没有?Top

4 楼df8327(DF)回复于 2003-12-03 00:18:20 得分 0

多谢mfc168(闶阆——项目开发中)   ,加上了就正常了:)Top

相关问题

  • 编程技巧
  • 求教windows 编程技巧
  • ★★★★ 一个编程技巧问题 ★★★★
  • 一个编程技巧求救。
  • 问一个简单的编程技巧
  • 挑战你的编程技巧......
  • 征求“java编程技巧10001例”完全版!
  • 我要《电脑编程技巧与维护》的网址
  • 求监视程序动作的编程技巧,送100分
  • Bufeng收藏——Delphi 编程技巧 之一 【代发】

关键词

  • hdr
  • tcp
  • ip
  • unsigned
  • 定义
  • 地址
  • th
  • short
  • 目的
  • typedef struct

得分解答快速导航

  • 帖主:df8327
  • mfc168

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo