TCP/IP協議傳輸文件

     主要是複習socket通信過程,客戶端過程:申請socket,connect,recv/send ,close

    客戶端過程:socket,bind,listen,accept,send/recv,close

   

   /***客戶端輸入你所要傳輸的文件名,服務器端就是輸入接收後保存的文件名***/

 客戶端demo:

/*****文件傳輸之客戶端*****/
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#include<arpa/inet.h>
#include<errno.h>
#include<fcntl.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<pthread.h>
#include<stdio.h>
#include<sys/ipc.h>


#define FILE_NAME_MAX_SIZE 512
#define BUFFER_SIZE  1024


int main(int argc, char *argv[])  
{  
    int client_sockfd;  
    
    struct sockaddr_in remote_addr; //服務器端網絡地址結構體  
   
    memset(&remote_addr,0,sizeof(remote_addr)); //數據初始化--清零  
    remote_addr.sin_family=AF_INET; //設置爲IP通信  
    remote_addr.sin_addr.s_addr=inet_addr("127.0.0.1");//服務器IP地址  
    remote_addr.sin_port=htons(8000); //服務器端口號  
      
    /*創建客戶端套接字--IPv4協議,面向連接通信,TCP協議*/  
    if((client_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)  
    {  
      perror("create client socket error.\n");
      exit(EXIT_FAILURE);
    }  
      
    /*將套接字綁定到服務器的網絡地址上*/  
    if(connect(client_sockfd,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr))<0)  
    {  
        perror("connect error\n");  
        return -1;  
    }  


char file_name[FILE_NAME_MAX_SIZE+1];
bzero(file_name,FILE_NAME_MAX_SIZE+1);

printf("please input the file name:\n");
scanf("%s",file_name);

char buffer[BUFFER_SIZE];
bzero(buffer,BUFFER_SIZE);

strncpy(buffer,file_name,strlen(file_name)>BUFFER_SIZE ?BUFFER_SIZE:strlen(file_name)); //文件最大長度規定爲1024
send(client_sockfd,buffer,BUFFER_SIZE,0);

FILE *fp=fopen(file_name,"r");
if(fp==NULL)
{
  printf("file:\t %s can not open to write.\n",file_name);
  exit(EXIT_FAILURE);
}
else
{
 bzero(buffer,BUFFER_SIZE);
 int file_block_length=0;
 while((file_block_length=fread(buffer,sizeof(char),BUFFER_SIZE,fp))>0)
 {
       if(send(client_sockfd,buffer,file_block_length,0)<0)
            {
    printf("send file error\n");
break;
}
bzero(buffer,BUFFER_SIZE);
 }
 fclose(fp);
 printf("file:\t %s transfer finished\n",file_name);  
}

 close(client_sockfd);
 return 0;
 }
  


服務器端demo:


/*****文件傳輸之服務器端*****/
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<string.h>
#include<pthread.h>
#include<signal.h>
#include<time.h>
#include<errno.h>
#include<dirent.h>
#include<sys/stat.h>


#define FILE_NAME_MAX_SIZE 512

int main(int argc, char *argv[])  
{  
    int server_sockfd;//服務器端套接字  
    int client_sockfd;//客戶端套接字  
    int len;  
    struct sockaddr_in my_addr;   //服務器網絡地址結構體  
    struct sockaddr_in remote_addr; //客戶端網絡地址結構體  
    int sin_size;  
    
    memset(&my_addr,0,sizeof(my_addr)); //數據初始化--清零  
    my_addr.sin_family=AF_INET; //設置爲IP通信  
    my_addr.sin_addr.s_addr=INADDR_ANY;//服務器IP地址--允許連接到所有本地地址上  
    my_addr.sin_port=htons(8000); //服務器端口號  
      
/********TCP/IP協議**********/
 
    /*創建服務器端套接字--IPv4協議,面向連接通信,TCP協議*/  
    if((server_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)  
    {    
        fprintf(stderr,"creat socket fd error\n");
        exit(EXIT_FAILURE); 
    }  
   
        /*將套接字綁定到服務器的網絡地址上*/  
    if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)  
    {  
        perror("bind error\n");
        exit(EXIT_FAILURE);
    }  
      
    /*監聽連接請求--監聽隊列長度爲5*/  
    if((listen(server_sockfd,1000))==-1)
   {
     fprintf(stderr,"create socket fd error \n");
     exit(EXIT_FAILURE);
   }  
   
    char file_name[FILE_NAME_MAX_SIZE+1];
bzero(file_name,FILE_NAME_MAX_SIZE+1);
printf("enter the name:\n");
scanf("%s",file_name);
   while(1)
   {
      sin_size=sizeof(struct sockaddr_in); 
     if((client_sockfd=accept(server_sockfd,(struct sockaddr *)&remote_addr,&sin_size))<0)  
    {  
        perror("accept");  
        return 1;  
    }
char buf[BUFSIZ];  //數據傳送的緩衝區  
bzero(buf,BUFSIZ);

int length=recv(client_sockfd,buf,BUFSIZ,0);
    if(length<0)
{
printf("server receive data failed.\n");
break;
}



FILE *fp=fopen(file_name,"w");
if(NULL==fp)
{
 printf("file:\t %s not found..\n",file_name);
}
else
{
  bzero(buf,BUFSIZ);
  int length=0;
  while(length=recv(client_sockfd,buf,BUFSIZ,0))
  {
    if(length<0)
{
  printf("receive file failed..\n");
  break;
}
int write_length=fwrite(buf,sizeof(char),BUFSIZ,fp);
if(write_length<length)
{
   printf("file:\t %s failed..\n",file_name);
break;
}
bzero(buf,BUFSIZ);
  }
  printf("finish..\n");
}
   fclose(fp);
   close(client_sockfd);
close(server_sockfd);
return 0;
}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章