• 网络编程 10.26


    1. #include
    2. #define SER_PORT 69
    3. int main(int argc, const char *argv[])
    4. {
    5. int cfd=socket(AF_INET,SOCK_DGRAM,0);//创建套接字文件用于发送给服务器
    6. if(cfd==-1)//判断套接字文件是否创建成功
    7. {
    8. perror("socket error");
    9. return -1;
    10. }
    11. printf("*********************\n");
    12. printf("********1.下载*******\n");
    13. printf("********2.上传*******\n");
    14. printf("********3.退出*******\n");
    15. printf("*********************\n");
    16. struct sockaddr_in sin;//定义地址信息结构体 用于发给服务器
    17. sin.sin_family=AF_INET;//IPV4协议
    18. sin.sin_port=htons(SER_PORT);//端口号 默认为69
    19. sin.sin_addr.s_addr=inet_addr(argv[1]);//外部传参写入IP地址
    20. socklen_t socklen=sizeof(sin);//求结构体大小 sizeof(sin)不能取地址
    21. char buf[516]="";//定义读写请求的包
    22. char ack[4]="";//定义ACK应答包
    23. short *a1=(short *)ack;//定义一个指针a1指向字符串ack首地址 ack为char类型 但指针是short要强转
    24. *a1=htons(4);//给字符数组ack前两个字节赋值为4 因为要上传到服务器 所以要转成网络字节序
    25. short *a2=(short*)ack+1;//定义一个指针a2指向ack后两字节 short类型指针偏移量为2字节
    26. int a=0;
    27. int b=1;
    28. char filename[20]="";//定义下载文件名的字符数组
    29. char filename1[20]="";//定义上传文件名的字符数组
    30. while(1)//循环
    31. {
    32. *a2=htons(b);//
    33. bzero(buf,sizeof(buf));
    34. short*p1=(short*)buf;
    35. scanf("%d",&a);//输入数字 1.下载 2.上传 3.退出
    36. if(3==a)
    37. break;
    38. if(1==a)
    39. {
    40. *p1=htons(a);
    41. getchar();
    42. char *p2=buf+2;
    43. printf("请输入要下载的文件名\n");
    44. scanf("%s",filename);//获取文件名
    45. strcpy(p2,filename);
    46. getchar();
    47. char*p3=p2+strlen(p2);
    48. *p3=0;
    49. char *p4=p3+1;
    50. strcpy(p4,"octet");
    51. sendto(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,sizeof(sin));
    52. int fp=open(filename,O_RDWR|O_CREAT|O_TRUNC,0664);
    53. if(fp==-1)
    54. {
    55. perror("open error");
    56. return -1;
    57. }
    58. while(1)
    59. {
    60. bzero(buf,sizeof(buf));
    61. size_t res=recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,&socklen);
    62. int ret=write(fp,buf+4,res-4);
    63. if(ret<512)
    64. break;
    65. sendto(cfd,ack,sizeof(ack),0,(struct sockaddr*)&sin,sizeof(sin));
    66. b++;
    67. *a2=htons(b);
    68. }
    69. close(fp);
    70. }else if(2==a)
    71. {
    72. printf("请输入要上传的文件名");
    73. scanf("%s",filename1);
    74. printf("文件名为:%s",filename1);
    75. }
    76. }
    77. close(cfd);
    78. return 0;
    79. }

  • 相关阅读:
    Webpack-入门
    RPC实现简单解析
    SCADA 总体设计(二)
    C/C++ Linux 用户态协议栈的实现
    Spring MVC中的异常处理
    ORB-SLAM3在保存地图时高频率崩溃问题
    leaflet入门使用教程
    xtrabackup 2.4 的介绍与使用
    深入剖析Tomcat(八) 载入器与打破双亲委派机制的自定义类加载器
    AIGC赋能,天猫精灵、华米科技“抢跑”智能穿戴
  • 原文地址:https://blog.csdn.net/u014137683/article/details/134066292