• c 利用socket传输大文件


    server:

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <string.h>
    4. #include <unistd.h>
    5. #include <arpa/inet.h>
    6. #include <sys/socket.h>
    7. int fasong(void);
    8. int main(void){
    9. FILE *f=fopen("/home/wzpc/c/1.mp4","r");
    10. if(f==NULL){
    11. puts("file error\n");
    12. }
    13. long int n=0;
    14. while(!feof(f)){ //读写文件长度
    15. fgetc(f);
    16. n++;
    17. }
    18. //-------------------------------------------------
    19. rewind(f); //文件指针返回文件起点
    20. printf("%ld\n",n);
    21. int sp=fasong();
    22. write(sp,&n,8); //传送总字节数
    23. /*
    24. char c;
    25. fread(&c,1,1,f);
    26. for(int t=0;t<n;t++){
    27. write(sp,&c,1);
    28. fread(&c,1,1,f);
    29. }
    30. //----------------------1.采用读文件一字节传送一字节,速度非常慢
    31. */
    32. char *pt=calloc(n,sizeof(char));
    33. fread(pt,n,1,f);
    34. int ee=0;
    35. for(int k=0;(k*1024)<n;k++){
    36. if(k*1024+1024>n){ //判断最后一次剩余字节数
    37. ee=n-k*1024;
    38. }else{
    39. ee=1024;
    40. }
    41. send(sp,&pt[k*1024],ee,0);
    42. }
    43. //-----------------------2. 采用块读取,每次1024字节,速度特快,因为socket每次传输有字节数限制,所有这理限定每次传输1024字节
    44. fclose(f);
    45. close(sp);
    46. free(pt);
    47. return 0;
    48. }
    49. int fasong(void){ //socket 连接
    50. struct sockaddr_in serv,*p;
    51. memset(&serv,0,sizeof(serv));
    52. p=&serv;
    53. p->sin_family=AF_INET;
    54. p->sin_addr.s_addr=htonl(INADDR_ANY);
    55. p->sin_port=htons(3000);
    56. int sk=socket(PF_INET,SOCK_STREAM,0);
    57. if(sk==-1){
    58. puts("socket error\n");
    59. }
    60. if(bind(sk,(struct sockaddr*)&serv,sizeof(serv))==-1){
    61. puts("bind error\n");
    62. }
    63. if(listen(sk,10)==-1){
    64. puts("listen error\n");
    65. }
    66. puts("listening port\n");
    67. int ck=accept(sk,NULL,NULL);
    68. if(ck==-1){
    69. puts("accept error\n");
    70. }
    71. //-------------------------------------------------------
    72. return ck;
    73. }

    client

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <string.h>
    4. #include <unistd.h>
    5. #include <arpa/inet.h>
    6. #include <sys/socket.h>
    7. int jisou(void);
    8. int main(void){
    9. FILE *f1=fopen("/home/wzpc/c/2.mp4","w+");
    10. if(f1==NULL){
    11. puts("file error\n");
    12. }
    13. long int len;
    14. int ss=jisou();
    15. read(ss,&len,8);
    16. printf("%ld\n",len);
    17. /* char c;
    18. recv(ss,&c,1,0);
    19. for(int t=0;t<len;t++){
    20. fwrite(&c,1,1,f1);
    21. recv(ss,&c,1,0);
    22. }*/
    23. char *pt=calloc(len,sizeof(char));
    24. int ee=0;
    25. for(int k=0;(k*1024)<len;k++){
    26. if(k*1024+1024>len){
    27. ee=len-k*1024;
    28. }else{
    29. ee=1024;
    30. }
    31. recv(ss,&pt[1024*k],ee,0);
    32. }
    33. fwrite(pt,len,1,f1);
    34. close(ss);
    35. fclose(f1);
    36. free(pt);
    37. return 0;
    38. }
    39. int jisou(void){
    40. int sock=socket(PF_INET,SOCK_STREAM,0);
    41. if(sock==-1)
    42. puts("socket() error");
    43. struct sockaddr_in addr,*p;
    44. memset(&addr,0,sizeof(addr));
    45. p=&addr;
    46. p->sin_family=AF_INET;
    47. p->sin_addr.s_addr=inet_addr("127.0.0.1");
    48. p->sin_port=htons(3000);
    49. if(connect(sock,(struct sockaddr*)&addr,sizeof(addr))==-1)
    50. puts("connect() error");
    51. return sock;
    52. }

    c比java的socket传输快多了,肉眼可见的快。

    特别注意,c中的数组长度是有限制的,如是大数组最好用动态分配内存。如malloc,calloc,  还有c中socket一次传输的字节数也是有限制的。最好选1024  2048 ,不要太大。

     

     

     

     

  • 相关阅读:
    安卓连接mysql数据库,使用okhttp
    TCP/IP协议群
    Go runtime 调度器精讲(六):非 main goroutine 运行
    汇总selenium利用xpath等找网页节点的方法(二)
    基于HTTP服务器/客户端的实验
    Peter算法小课堂—蠕动区间
    安防行业集团采购管理系统:全链深度融合,建立透明、扁平化集团采购平台
    Spring Cloud Alibaba 整合 Seata 实现分布式事务
    杰理之手动配对方式【篇】
    GitHub 官方大动作频频「GitHub 热点速览 v.22.24」
  • 原文地址:https://blog.csdn.net/m0_59802969/article/details/133432948