5-8万年薪顶级嵌入式,京沪深就业地 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

高手请进,tcp/ip的问题 200高分相送 不够再来!急

楼主wordsgolden(三好学生)2002-07-11 15:23:10 在 VC/MFC / 基础类 提问

接受网络里面所有的请求,并给于每个请求返回三个unreach,两个rst。目的是中断请求。  
  以下是我的程序代码,(其中运行时在ret=setsockopt(shoe,IPPROTO_IP,IP_HDRINCL,(char*)&bOpt,sizeof(bOpt));处报错):  
  头文件   struct.h  
  /*struct.h*/  
  struct   iphdr       //ip头  
  {  
        int   version;   //版本号  
        int ihl;       //头长度  
        unsigned   char tos;//服务类型  
        unsigned   short tot_len;//总长  
        unsigned   short       id;//序号  
        unsigned   short frag_off;//标志  
        unsigned   char ttl;//寿命  
        unsigned   char protocol;//协议  
        unsigned   short check;//校验  
        unsigned   int saddr;//源地址  
        unsigned   int daddr;//目的地址  
  };  
   
  ///////////////////////////////////////////  
   
  struct   tcphdr//tcp头结构  
  {  
        unsigned   short source;//源地址  
        unsigned   short dest;//目的地址  
        unsigned   char         seq;  
        unsigned   short ack_seq;  
        unsigned   short doff;  
        bool res1;  
        bool res2;  
        bool urg;    
        bool ack;  
        bool psh;  
        bool rst;  
        bool syn;  
        bool fin;  
        unsigned   long window;  
        unsigned   short check;  
        int urg_ptr;  
  };  
   
  ////////////////////////////////////////////  
   
  struct   icmphdr//icmp头结构  
  {  
  int   type;  
  int   code;  
  unsigned   short   icmpchecksum;  
   
  };  
   
   
  cpp文件:  
  //   test0.cpp   :   Defines   the   entry   point   for   the   console   application.  
  #include   "stdafx.h"  
  #include   <winsock2.h>  
  #include   <stdlib.h>  
  #include   <stdio.h>  
  #include   <windows.h>  
  #include   "struct.h"  
  #include   <winbase.h>  
  #include   <WS2TCPIP.h>  
  void   reset(struct   iphdr   *,struct   tcphdr   *,int);  
  void   unreach(unsigned   int,struct   iphdr   *,struct   icmphdr   *,int);  
  void   main()  
  {  
  bool   response_flag;  
  SOCKET   shoe;  
  bool   bOpt;  
  int   i;  
  int   ret;  
  char   *buffer;  
  WSADATA   wsaData;  
          if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)//使用winsock2.2  
  {  
  printf("WSAStartup()   failed:%d\n",WSAGetLastError());  
  return   ;  
  }  
  shoe=WSASocket(AF_INET,   SOCK_RAW,   IPPROTO_TCP,   NULL,   0,0);  
  if(shoe==INVALID_SOCKET)  
  {  
  printf("WSASocket()   failed:   %d\n",WSAGetLastError());  
  return;  
  }  
  bOpt=TRUE;  
  ret=setsockopt(shoe,IPPROTO_IP,IP_HDRINCL,(char*)&bOpt,sizeof(bOpt));//此处报错  
  if(ret==SOCKET_ERROR)  
  {  
  printf("setsockopt(IP_HDRINCL)   failed:%d\n",WSAGetLastError());  
                  return;  
  }  
  struct   epack  
  {  
  struct   iphdr   ip;  
  struct   tcphdr   tcp;  
  struct   icmphdr   icmp;        
  }epack;  
          buffer=(char*)malloc(sizeof(epack));  
  int   dlen;  
  struct   sockaddr   dest;  
  struct   iphdr     *iphp;  
  struct   tcphdr   *tcphp;  
  struct   icmphdr   *icmphp;  
  iphp=(struct   iphdr   *)(((unsigned   long)&epack.ip)-2);  
      tcphp=(struct   tcphdr   *)(((unsigned   long)&epack.tcp)-2);  
  icmphp=(struct   icmphdr   *)(((unsigned   long)&epack.icmp)-2);  
  while(1)  
  {  
  if(recvfrom(shoe,buffer,sizeof(epack),0,&dest,&dlen))  
  response_flag=1;  
  if(response_flag)  
  {        
                                  unreach(0,iphp,icmphp,shoe);//返回网络不可得  
                                  unreach(1,iphp,icmphp,shoe);       //主机不可得  
                                  unreach(3,iphp,icmphp,shoe);//端口不可得  
  for(i=0;i<2;i++)  
        reset(iphp,tcphp,shoe);//返回rst  
  }  
  }  
  }  
  void   reset(struct   iphdr   *iphp,struct   tcphdr   *tcphp,int   shoe)  
  {  
   
    char*   sendbuffer;  
   
  void   dump(struct   iphdr   *,struct   tcphdr   *);  
                   
          struct   tpack  
  {  
                                  struct   iphdr   ip;  
                                  struct   tcphdr   tcp;  
    }tpack;                                  
   
                   
                  struct   pseudo_header{                      
                                  unsigned   source_address;  
                                  unsigned   dest_address;  
                                  unsigned   char   placeholder;  
                                  unsigned   char   protocol;  
                                  unsigned   short   tcp_length;  
                                  struct   tcphdr   tcp;  
                  }pheader;  
       
        struct   sockaddr_in   sin;                  
                                                   
              sin.sin_family=AF_INET;      
                  sin.sin_port=tcphp->dest;                
                  sin.sin_addr.s_addr=iphp->saddr;  
                  tpack.tcp.source=tcphp->dest;        
                  tpack.tcp.dest=tcphp->source;        
                  tpack.tcp.seq=0;                  
                  tpack.tcp.ack_seq=htonl(ntohl(tcphp->seq)+1);        
                  tpack.tcp.doff=5;                             /*   Data   offset   */  
                  tpack.tcp.res1=0;                             /*   reserved   */  
                  tpack.tcp.res2=0;                             /*   reserved   */  
              tpack.tcp.urg=0;                               /*   Urgent   offset   valid   flag   */  
                  tpack.tcp.ack=1;                               /*   Acknowledgement   field   valid   flag   */  
                  tpack.tcp.psh=0;                               /*   Push   flag   */  
                  tpack.tcp.rst=1;                               /*   Reset   flag   */  
                  tpack.tcp.syn=0;                               /*   Synchronize   sequence   numbers   flag   */  
                  tpack.tcp.fin=0;                               /*   Finish   sending   flag   */  
                  tpack.tcp.window=0;   /*   16-bit   Window   size   */  
                  tpack.tcp.check=0;                           /*   16-bit   checksum   (to   be   filled   in   below)   */  
                  tpack.tcp.urg_ptr=0;                       /*   16-bit   urgent   offset   */  
                  tpack.ip.version=4;                         /*   4-bit   Version   */  
                  tpack.ip.ihl=5;                                 /*   4-bit   Header   Length   */  
                  tpack.ip.tos=0;                                 /*   8-bit   Type   of   service   */  
          tpack.ip.tot_len=htons(sizeof(struct   iphdr)+sizeof(struct   tcphdr));     /*   16-bit   Total   length   */  
                  tpack.ip.id=0;                   /*   16-bit   ID   field   */  
                  tpack.ip.frag_off=0;                       /*   13-bit   Fragment   offset   */  
                  tpack.ip.ttl=64;                 /*   8-bit   Time   To   Live   */  
                  tpack.ip.protocol=IPPROTO_TCP;   /*   8-bit   Protocol   */  
                  tpack.ip.check=0;                             /*   16-bit   Header   checksum   (filled   in   below)   */  
                  tpack.ip.saddr=iphp->daddr;         /*   32-bit   Source   Address   */  
                  tpack.ip.daddr=iphp->saddr;         /*   32-bit   Destination   Address   */  
                   
                  pheader.source_address=(unsigned)tpack.ip.saddr;  
                  pheader.dest_address=(unsigned)tpack.ip.daddr;  
                  pheader.placeholder=0;  
            pheader.protocol=IPPROTO_TCP;  
                  pheader.tcp_length=htons(sizeof(struct   iphdr));  
  sendbuffer=(char   *)malloc(sizeof(tpack)+sizeof(pheader));  
                sendto(shoe,sendbuffer,sizeof(struct   iphdr)+sizeof(struct   tcphdr),0,(struct   sockaddr   *)&sin,sizeof(sin));  
  #ifndef   QUIET  
  dump(iphp,tcphp);  
  #endif  
  }  
  void   dump(struct   iphdr   *iphp,struct   tcphdr   *tcphp)  
  {  
  fprintf(stdout,"Connection-establishment   Attempt:   ");  
  fprintf(stdout,"Thwarting...\n");  
  }  
   
  /////////////////////////////////////////////////  
   
  //these   functions   are   icmp   unreach  
  //1:netunreach  
  //2:hostunreach  
  //3:portunreach  
  /////////////////////////////////////////////////  
  void   unreach(unsigned   int   icmpcode,struct   iphdr   *iphp,struct   icmphdr   *icmphp,int   shoe)  
  {  
  char   *   sendbuffer1;  
  void   dump();  
  struct   tcphdr*   tcphp;  
  struct   ppack  
  {  
    struct   iphdr   ip;  
    struct   icmphdr   icmp;  
  }   ppack;  
      struct   sockaddr_in   sin1;  
      sin1.sin_family=AF_INET;  
      sin1.sin_port=tcphp->dest;  
      sin1.sin_addr.s_addr=iphp->saddr;  
      ppack.ip.ihl=5;  
      ppack.ip.version=4;  
      ppack.ip.tos=0;  
      ppack.ip.tot_len=htons(sizeof(struct   iphdr)+sizeof(struct   icmphdr));  
      ppack.ip.id=0;  
      ppack.ip.frag_off=0;  
      ppack.ip.ttl=64;  
      ppack.ip.protocol=IPPROTO_ICMP;  
      ppack.ip.check=0;  
      ppack.ip.saddr=iphp->daddr;  
      ppack.ip.daddr=iphp->saddr;  
      ppack.icmp.type=3;  
      ppack.icmp.code=icmpcode;  
      ppack.icmp.icmpchecksum=0;  
      sendbuffer1=(char*)malloc(sizeof(ppack));  
      sendto(shoe,sendbuffer1,sizeof(struct   iphdr)+sizeof(struct   icmphdr),0,(struct   sockaddr*)&sin1,sizeof(sin1));  
  } 问题点数:100、回复次数:15Top

1 楼wordsgolden(三好学生)回复于 2002-07-11 15:24:57 得分 0

我的系统是win2k   server   familyTop

2 楼Kevin_qing()回复于 2002-07-11 16:47:52 得分 25

SOCKET   sRaw=socket(PF_INET,SOCK_RAW,0);  
  int bOpt=TRUE;  
  printf("RAW   %d\n",setsockopt(sRaw,IPPROTO_IP,IP_HDRINCL,(char*)&bOpt,sizeof(bOpt)));  
  Top

3 楼yangtian(思想有多远,前途有多远)回复于 2002-07-11 17:00:45 得分 0

哎,晕Top

4 楼wordsgolden(三好学生)回复于 2002-07-11 17:12:17 得分 0

setsockopt(sRaw,IPPROTO_IP,IP_HDRINCL,(char*)&bOpt,sizeof(bOpt)));  
  出错~   为什么?求助!  
  再麻烦     Kevin_qing()   大哥!Top

5 楼kingzai(stevenzhu)回复于 2002-07-11 17:12:20 得分 50

if    
  ((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAP  
  PED))==INVALID_SOCKET)    
  {    
  printf("Socket   Setup   Error!\n");    
  return   false;    
  }    
  BOOL   flag=true;    
  if   (setsockopt(sock,IPPROTO_IP,   IP_HDRINCL,(char    
  *)&flag,sizeof(flag))==SOCKET_ERROR)    
  {    
  printf("setsockopt   IP_HDRINCL   error!\n");    
  return   false;    
  }Top

6 楼Kevin_qing()回复于 2002-07-11 17:12:20 得分 0

你的socket建立参数有问题Top

7 楼kingzai(stevenzhu)回复于 2002-07-11 17:13:14 得分 0

if    
  ((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAP  
  PED))==INVALID_SOCKET)    
  {    
  printf("Socket   Setup   Error!\n");    
  return   false;    
  }    
  BOOL   flag=true;    
  if   (setsockopt(sock,IPPROTO_IP,   IP_HDRINCL,(char    
  *)&flag,sizeof(flag))==SOCKET_ERROR)    
  {    
  printf("setsockopt   IP_HDRINCL   error!\n");    
  return   false;    
  }Top

8 楼kingzai(stevenzhu)回复于 2002-07-11 17:14:24 得分 0

if    
  ((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAP  
  PED))==INVALID_SOCKET)    
  {    
  printf("Socket   Setup   Error!\n");    
  return   false;    
  }    
  BOOL   flag=true;    
  if   (setsockopt(sock,IPPROTO_IP,   IP_HDRINCL,(char    
  *)&flag,sizeof(flag))==SOCKET_ERROR)    
  {    
  printf("setsockopt   IP_HDRINCL   error!\n");    
  return   false;    
  }Top

9 楼Kevin_qing()回复于 2002-07-11 17:14:53 得分 0

把shoe=WSASocket(AF_INET,   SOCK_RAW,   IPPROTO_TCP,   NULL,   0,0);  
  改为shoe=socket(PF_INET,SOCK_RAW,0);  
   
  WSASocket()函数我没用过,大概是你写的第3个参数有问题  
   
  Top

10 楼wordsgolden(三好学生)回复于 2002-07-11 17:38:01 得分 0

kingzai:你的程序和   Kevin_qing的基本一样啊。我调试了一下,也是报错,拜托有时间帮我调试一下  
     
    我这个程序是防火墙联动的一个小模块Top

11 楼kingzai(stevenzhu)回复于 2002-07-11 17:45:08 得分 0

我记起来了,  
  注意,如果设置IP_HDRINCL   选项,那么必须具有   administrator  
  权限,要不就必须修改注册表:  
  HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Afd\Parameter\  
  修改键:DisableRawSecurity(类型为DWORD),把值修改为   1。如果没有,就添加。Top

12 楼xuying()回复于 2002-07-11 20:51:22 得分 25

这是<windows网络编程技术>第13章的一端例子,除了它用udp,你用tcp外,没有什么不一样的。你试试这段程序看看。最好把错误号贴出来看看。  
          //     Creating   a   raw   socket  
          //  
          s   =   WSASocket(AF_INET,   SOCK_RAW,   IPPROTO_UDP,   NULL,   0,0);  
          if   (s   ==   INVALID_SOCKET)  
          {  
                  printf("WSASocket()   failed:   %d\n",   WSAGetLastError());  
                  return   -1;  
          }  
   
          //   Enable   the   IP   header   include   option    
          //  
          bOpt   =   TRUE;  
          ret   =   setsockopt(s,   IPPROTO_IP,   IP_HDRINCL,   (char   *)&bOpt,   sizeof(bOpt));  
          if   (ret   ==   SOCKET_ERROR)  
          {  
                  printf("setsockopt(IP_HDRINCL)   failed:   %d\n",   WSAGetLastError());  
                  return   -1;  
          }  
   
  Top

13 楼wordsgolden(三好学生)回复于 2002-07-12 08:12:42 得分 0

错误号是10022Top

14 楼kingzai(stevenzhu)回复于 2002-07-12 08:50:38 得分 0

http://www.csdn.net/expert/topic/867/867221.xml?temp=.4360468Top

15 楼kingzai(stevenzhu)回复于 2002-07-12 08:56:47 得分 0

http://www.csdn.net/expert/topic/867/867221.xml?temp=.4360468Top

16 楼wordsgolden(三好学生)回复于 2002-07-12 09:09:41 得分 0

kingzai:不好意思那个家伙是我的朋友,之所以结帖,是因为都不对啊。:(  
    真不知道是为什么??Top

17 楼wordsgolden(三好学生)回复于 2002-07-12 11:03:11 得分 0

这里的各位想要分的以后多多回答我的问题啊  
  还想给你们分   可是不知道该怎么给,反正以后回答了我的问题我就给:)Top

相关问题

  • TCP/IP的三大服务是什么呀<对不起呀分数不够了>
  • 关于TCP/IP连接的问题???急!!!
  • 急需TCP/IP方面的电子书
  • TCP/IP问题
  • TCP/IP协义
  • TCP/IP请教
  • tcp/ip 编程
  • TCP/IP编程
  • TCP/IP问题
  • 关于tcp/ip

关键词

  • .net
  • 32-bit
  • tcp
  • socket
  • tpack
  • hdrincl
  • bopt
  • wsasocket
  • ipproto
  • setsockopt

得分解答快速导航

  • 帖主:wordsgolden
  • Kevin_qing
  • kingzai
  • xuying

相关链接

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

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
x 提问