Chinaunix首页 | 论坛 | 博客
  • 博客访问: 129287
  • 博文数量: 30
  • 博客积分: 972
  • 博客等级: 中士
  • 技术积分: 332
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-08 10:04
文章分类

全部博文(30)

文章存档

2012年(30)

分类: LINUX

2012-07-11 18:40:18


 

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<sys/socket.h>
  3. #include<sys/types.h>
  4. #include<sys/stat.h>
  5. #include<arpa/inet.h>
  6. #include<netinet/in.h>
  7. #include<unistd.h>
  8. #include<stdlib.h>
  9. #include<string.h>
  10. #include<fcntl.h>
  11. #define PACKLEN 516
  12. #define ACKLEN 4
  13. int main(int argc,char *argv[])
  14. {
  15.  int sock_fd,fd;
  16.  int recv=0;
  17.  char buf[1024]="",ack_packet[ACKLEN]="",req_packet[PACKLEN]="";
  18.  unsigned short port = 69;
  19.  struct sockaddr_in srv_addr,srv_addr2;
  20.  size_t ip_len = sizeof(srv_addr2);

  21.  bzero(&srv_addr,sizeof(srv_addr));

  22.  srv_addr.sin_family = AF_INET;
  23.  srv_addr.sin_port = htons(port);
  24.  inet_pton(AF_INET,argv[1],&srv_addr.sin_addr);

  25.  sock_fd = socket(AF_INET,SOCK_DGRAM,0);

  26.  sprintf(req_packet,"%c%c%s%c%s%c",0,1,argv[2],0,"octet",0);
  27.   
  28.  recv = sendto(sock_fd,req_packet,sizeof(req_packet),0,(struct sockaddr*)&srv_addr,sizeof(srv_addr));

  29.  if(recv == -1)
  30.  {
  31.   perror("sendto");
  32.   exit(-1);
  33.  }

  34.  fd=open(argv[2],O_RDWR|O_CREAT,0666);

  35.  if(fd < 0)
  36.  {
  37.   perror("open");
  38.   exit(0);
  39.  }

  40.  while(1)
  41.  {
  42.   recv=recvfrom(sock_fd,buf,PACKLEN,0,(struct sockaddr*)&srv_addr2,&ip_len);
  43.   if( 3 == (char)buf[1])
  44.   {
  45.    //if( num == (short)(buf+2))
  46.    //write(fd,buf+4,strlen(buf+4));
  47.     //else
  48.    //{
  49.    // printf("recv wrong packets\n");
  50.    // break;
  51.    //}
  52.    if( recv < 516 )
  53.    {
  54.     write(fd,buf+4,recv-4);
  55.     break;
  56.    }
  57.    else
  58.     write(fd,buf+4,recv-4);
  59.   }
  60.   
  61.   if( 4 == (char)buf[1])
  62.   {
  63.    printf("%s\n",buf+4);
  64.    break;
  65.   }
  66.   sprintf(ack_packet,"%c%c%c%c",0,4,0,0);
  67.   memcpy(ack_packet+2,buf+2,2);
  68.   sendto(sock_fd,ack_packet,ACKLEN,0,(struct sockaddr*)&srv_addr2,sizeof(srv_addr2));
  69.  }
  70.  close(fd);
  71.  close(sock_fd);
  72.  return 0;
  73. }


 

阅读(1979) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~