您的位置:首页 > 理论基础 > 计算机网络

Linux下基于TCP的文件传输

2017-03-10 22:08 561 查看
服务器:

[cpp] view
plain copy

#include <netinet/in.h>  

#include <sys/types.h>  

#include <sys/socket.h>  

#include <stdio.h>  

#include <stdlib.h>  

#include <time.h>  

#include <string.h>  

#define SERVER_PORT 6666  

#define LISTEN_QUEUE 20  

#define BUFFER_SIZE 1024  

  

int main(int argc,char **argv)  

{  

  struct sockaddr_in server_addr;  

  bzero(&server_addr,sizeof(server_addr));//全部置零  

  //设置地址相关的属性  

  server_addr.sin_family=AF_INET;  

  server_addr.sin_addr.s_addr=htons(INADDR_ANY);  

  server_addr.sin_port=htons(SERVER_PORT);  

  

  

  //创建套接字  

  int server_socket=socket(AF_INET,SOCK_STREAM,0);  

  if(server_socket<0)   

   {  

     printf("socket create error\n");  

     exit(1);  

   }  

  //绑定端口  

  if(bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))  

    {  

      printf("bind error\n");  

      exit(1);  

    }  

  //服务器端监听  

   if(listen(server_socket,LISTEN_QUEUE))  

    {  

      printf("Server listen error\n");  

      exit(1);  

    }  

  

  //服务器端一直运行  

  while(1)  

   {  

     pid_t pid;  

     struct sockaddr_in client_addr;  

     socklen_t length=sizeof(client_addr);  

     //accept返回一个新的套接字与客户端进行通信  

     int new_server_socket=accept(server_socket,(struct sockaddr*)&client_addr,&length);  

//1*begin******************************************************************************  

     if(new_server_socket==-1)  

      {  

        printf("accept error\n");  

        continue;  

      }  

     else  

      {  

        printf("客户端%s连接成功\n",inet_ntoa(client_addr.sin_addr));  

        pid=fork();  

 //3*begin**运行子进程*************************************************************  

        if(pid==0)  

         {  

           int data_len,flag=0;  

           char buffer[BUFFER_SIZE];  

           // 定义文件流  

           FILE *stream;  

           bzero(buffer,BUFFER_SIZE);  

           strcpy(buffer,"请输入要传输的文件的完整路径:");  

           strcat(buffer,"\n");  

             

           send(new_server_socket,buffer,BUFFER_SIZE,0);  

           bzero(buffer,BUFFER_SIZE);  

//2*begin**服务器接受数据*********************************************             

           if((stream=fopen("data","w"))==NULL)  

            {  

              printf("file open error\n");  

              exit(1);  

            }  

           else  

            {  

              bzero(buffer,BUFFER_SIZE);  

            }  

          // printf("正在接收来自%s的文件....\n",inet_ntoa(client_addr.sin_addr));  

           //先将数据接受到缓冲区buffer中,再写入到新建的文件中  

           while(data_len=recv(new_server_socket,buffer,BUFFER_SIZE,0))  

            {  

               flag++;  

               if(flag==1)  

                {  

                 printf("正在接收来自%s的文件....\n",inet_ntoa(client_addr.sin_addr));  

                  

                }  

              

              if(data_len<0)  

               {  

                printf("接收错误\n");  

                exit(1);  

               }  

              //向文件中写入数据  

              int write_len=fwrite(buffer,sizeof(char),data_len,stream);  

              if(write_len>data_len)  

               {  

                 printf("file write failed\n");  

                 exit(1);  

               }  

              bzero(buffer,BUFFER_SIZE);  

            }  

          if(flag>0)  

             printf("%s的文件传送完毕\n",inet_ntoa(client_addr.sin_addr));  

           if(flag==0)  

             printf("%s的文件传输失败\n",inet_ntoa(client_addr.sin_addr));  

//2*end**服务器接受数据****************************************************   

         // rename("data",inet_ntoa(client_addr.sin_addr));   

          fclose(stream);  

          rename("data",inet_ntoa(client_addr.sin_addr));  

          exit(1);           

         }  

//3*end**运行子进程**********************************************************  

        else  

         {  

           close(new_server_socket);  

         }  

      }  

//1*end**************************************************************************************  

   close(new_server_socket);  

   }  

 return 0;  

}  

客户端:

[cpp] view
plain copy

#include <netinet/in.h>  

#include <sys/types.h>      

#include <sys/socket.h>      

#include <stdio.h>          

#include <stdlib.h>         

#include <string.h>        

#include <time.h>                  

#include <arpa/inet.h>  

  

#define SERVER_PORT 6666  

#define BUFFER_SIZE 1024  

  

int main(int argc,char **argv)  

{  

 if(argc!=2)  

  {  

      printf("参数错误,清输入两个参数\n");  

     exit(1);  

   }  

  FILE *stream;  

  struct sockaddr_in server_addr;  

   bzero(&server_addr,sizeof(server_addr)); //把一段内存区的内容全部设置为0  

   server_addr.sin_family = AF_INET;    //internet协议族  

   server_addr.sin_addr.s_addr = inet_addr(argv[1]);  

   server_addr.sin_port = htons(SERVER_PORT);     

   int sfd;  

   sfd=socket(AF_INET,SOCK_STREAM,0);  

   if(sfd<0)  

    {  

      printf("socket error\n");  

      exit(0);  

    }  

   

   if(connect(sfd,(struct sockaddr*)&server_addr,sizeof(server_addr)) < 0)  

    {  

        printf("Can Not Connect To %s\n",argv[1]);  

        exit(1);  

    }  

  

    char buffer[BUFFER_SIZE];  

    bzero(buffer,BUFFER_SIZE);  

    int length = recv(sfd,buffer,BUFFER_SIZE,0);  

    if(length < 0)  

     {  

       printf("Recieve Data From Server %s Failed!\n", argv[1]);  

       exit(1);  

     }  

  

    printf("\n%s\n",buffer);  

    bzero(buffer,BUFFER_SIZE);  

   // fgets(buffer,1024,stdin);  

   // char filename[100];  

   gets(buffer);   

   //打开文件流  

    if((stream=fopen(buffer,"r"))==NULL)  

     {  

       printf("the file was not opened\n");  

       exit(1);  

     }  

    bzero(buffer,BUFFER_SIZE);  

    printf("正在传输...\n");  

    int len=0;  

    //不断读取并发送数据  

    while((len=fread(buffer,1,1024,stream))>0)  

     {  

      // printf("len=%d\n",len);  

       if(send(sfd,buffer,len,0)<0)  

         {  

            printf("send file error\n");  

            break;  

          }  

         bzero(buffer,BUFFER_SIZE);  

     }  

    if(fclose(stream))  

     {  

       printf("file close error\n");  

       exit(1);  

     }  

    close(sfd);  

    return 0;  

}  

服务器端运行:



客户端运行:



在服务器端的程序中,当一个客户端连接,就创建一个独立的进程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: