Linux下基于TCP的文件传输

本文介绍了一个简单的TCP文件传输程序,包括服务器端和客户端代码。服务器使用多进程处理多个客户端连接请求,实现文件的接收和存储;客户端负责选择文件并将其发送给指定的服务器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务器:

[cpp]  view plain  copy
  1. #include <netinet/in.h>  
  2. #include <sys/types.h>  
  3. #include <sys/socket.h>  
  4. #include <stdio.h>  
  5. #include <stdlib.h>  
  6. #include <time.h>  
  7. #include <string.h>  
  8. #define SERVER_PORT 6666  
  9. #define LISTEN_QUEUE 20  
  10. #define BUFFER_SIZE 1024  
  11.   
  12. int main(int argc,char **argv)  
  13. {  
  14.   struct sockaddr_in server_addr;  
  15.   bzero(&server_addr,sizeof(server_addr));//全部置零  
  16.   //设置地址相关的属性  
  17.   server_addr.sin_family=AF_INET;  
  18.   server_addr.sin_addr.s_addr=htons(INADDR_ANY);  
  19.   server_addr.sin_port=htons(SERVER_PORT);  
  20.   
  21.   
  22.   //创建套接字  
  23.   int server_socket=socket(AF_INET,SOCK_STREAM,0);  
  24.   if(server_socket<0)   
  25.    {  
  26.      printf("socket create error\n");  
  27.      exit(1);  
  28.    }  
  29.   //绑定端口  
  30.   if(bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))  
  31.     {  
  32.       printf("bind error\n");  
  33.       exit(1);  
  34.     }  
  35.   //服务器端监听  
  36.    if(listen(server_socket,LISTEN_QUEUE))  
  37.     {  
  38.       printf("Server listen error\n");  
  39.       exit(1);  
  40.     }  
  41.   
  42.   //服务器端一直运行  
  43.   while(1)  
  44.    {  
  45.      pid_t pid;  
  46.      struct sockaddr_in client_addr;  
  47.      socklen_t length=sizeof(client_addr);  
  48.      //accept返回一个新的套接字与客户端进行通信  
  49.      int new_server_socket=accept(server_socket,(struct sockaddr*)&client_addr,&length);  
  50. //1*begin******************************************************************************  
  51.      if(new_server_socket==-1)  
  52.       {  
  53.         printf("accept error\n");  
  54.         continue;  
  55.       }  
  56.      else  
  57.       {  
  58.         printf("客户端%s连接成功\n",inet_ntoa(client_addr.sin_addr));  
  59.         pid=fork();  
  60.  //3*begin**运行子进程*************************************************************  
  61.         if(pid==0)  
  62.          {  
  63.            int data_len,flag=0;  
  64.            char buffer[BUFFER_SIZE];  
  65.            // 定义文件流  
  66.            FILE *stream;  
  67.            bzero(buffer,BUFFER_SIZE);  
  68.            strcpy(buffer,"请输入要传输的文件的完整路径:");  
  69.            strcat(buffer,"\n");  
  70.              
  71.            send(new_server_socket,buffer,BUFFER_SIZE,0);  
  72.            bzero(buffer,BUFFER_SIZE);  
  73. //2*begin**服务器接受数据*********************************************             
  74.            if((stream=fopen("data","w"))==NULL)  
  75.             {  
  76.               printf("file open error\n");  
  77.               exit(1);  
  78.             }  
  79.            else  
  80.             {  
  81.               bzero(buffer,BUFFER_SIZE);  
  82.             }  
  83.           // printf("正在接收来自%s的文件....\n",inet_ntoa(client_addr.sin_addr));  
  84.            //先将数据接受到缓冲区buffer中,再写入到新建的文件中  
  85.            while(data_len=recv(new_server_socket,buffer,BUFFER_SIZE,0))  
  86.             {  
  87.                flag++;  
  88.                if(flag==1)  
  89.                 {  
  90.                  printf("正在接收来自%s的文件....\n",inet_ntoa(client_addr.sin_addr));  
  91.                   
  92.                 }  
  93.               
  94.               if(data_len<0)  
  95.                {  
  96.                 printf("接收错误\n");  
  97.                 exit(1);  
  98.                }  
  99.               //向文件中写入数据  
  100.               int write_len=fwrite(buffer,sizeof(char),data_len,stream);  
  101.               if(write_len>data_len)  
  102.                {  
  103.                  printf("file write failed\n");  
  104.                  exit(1);  
  105.                }  
  106.               bzero(buffer,BUFFER_SIZE);  
  107.             }  
  108.           if(flag>0)  
  109.              printf("%s的文件传送完毕\n",inet_ntoa(client_addr.sin_addr));  
  110.            if(flag==0)  
  111.              printf("%s的文件传输失败\n",inet_ntoa(client_addr.sin_addr));  
  112. //2*end**服务器接受数据****************************************************   
  113.          // rename("data",inet_ntoa(client_addr.sin_addr));   
  114.           fclose(stream);  
  115.           rename("data",inet_ntoa(client_addr.sin_addr));  
  116.           exit(1);           
  117.          }  
  118. //3*end**运行子进程**********************************************************  
  119.         else  
  120.          {  
  121.            close(new_server_socket);  
  122.          }  
  123.       }  
  124. //1*end**************************************************************************************  
  125.    close(new_server_socket);  
  126.    }  
  127.  return 0;  
  128. }  

客户端:

[cpp]  view plain  copy
  1. #include <netinet/in.h>  
  2. #include <sys/types.h>      
  3. #include <sys/socket.h>      
  4. #include <stdio.h>          
  5. #include <stdlib.h>         
  6. #include <string.h>        
  7. #include <time.h>                  
  8. #include <arpa/inet.h>  
  9.   
  10. #define SERVER_PORT 6666  
  11. #define BUFFER_SIZE 1024  
  12.   
  13. int main(int argc,char **argv)  
  14. {  
  15.  if(argc!=2)  
  16.   {  
  17.       printf("参数错误,清输入两个参数\n");  
  18.      exit(1);  
  19.    }  
  20.   FILE *stream;  
  21.   struct sockaddr_in server_addr;  
  22.    bzero(&server_addr,sizeof(server_addr)); //把一段内存区的内容全部设置为0  
  23.    server_addr.sin_family = AF_INET;    //internet协议族  
  24.    server_addr.sin_addr.s_addr = inet_addr(argv[1]);  
  25.    server_addr.sin_port = htons(SERVER_PORT);     
  26.    int sfd;  
  27.    sfd=socket(AF_INET,SOCK_STREAM,0);  
  28.    if(sfd<0)  
  29.     {  
  30.       printf("socket error\n");  
  31.       exit(0);  
  32.     }  
  33.    
  34.    if(connect(sfd,(struct sockaddr*)&server_addr,sizeof(server_addr)) < 0)  
  35.     {  
  36.         printf("Can Not Connect To %s\n",argv[1]);  
  37.         exit(1);  
  38.     }  
  39.   
  40.     char buffer[BUFFER_SIZE];  
  41.     bzero(buffer,BUFFER_SIZE);  
  42.     int length = recv(sfd,buffer,BUFFER_SIZE,0);  
  43.     if(length < 0)  
  44.      {  
  45.        printf("Recieve Data From Server %s Failed!\n", argv[1]);  
  46.        exit(1);  
  47.      }  
  48.   
  49.     printf("\n%s\n",buffer);  
  50.     bzero(buffer,BUFFER_SIZE);  
  51.    // fgets(buffer,1024,stdin);  
  52.    // char filename[100];  
  53.    gets(buffer);   
  54.    //打开文件流  
  55.     if((stream=fopen(buffer,"r"))==NULL)  
  56.      {  
  57.        printf("the file was not opened\n");  
  58.        exit(1);  
  59.      }  
  60.     bzero(buffer,BUFFER_SIZE);  
  61.     printf("正在传输...\n");  
  62.     int len=0;  
  63.     //不断读取并发送数据  
  64.     while((len=fread(buffer,1,1024,stream))>0)  
  65.      {  
  66.       // printf("len=%d\n",len);  
  67.        if(send(sfd,buffer,len,0)<0)  
  68.          {  
  69.             printf("send file error\n");  
  70.             break;  
  71.           }  
  72.          bzero(buffer,BUFFER_SIZE);  
  73.      }  
  74.     if(fclose(stream))  
  75.      {  
  76.        printf("file close error\n");  
  77.        exit(1);  
  78.      }  
  79.     close(sfd);  
  80.     return 0;  
  81. }  

服务器端运行:


客户端运行:

在服务器端的程序中,当一个客户端连接,就创建一个独立的进程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值