歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux下基於TCP的文件傳輸

服務器:

  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返回一個新的套接字與www.linuxidc.com客戶端進行通信   
  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. }  
Copyright © Linux教程網 All Rights Reserved