⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fileclient.c

📁 在LINUX下的一个多线程的服务器和客户端的网络传输程序
💻 C
字号:
/* 
 Very simple file transferring client.
 Copyright (C) 2004-2006, Li Suke, School of Software and Microelectronics,
 Peking University
 This  is free software; you can redistribute it and/or
 modify it freely.

 This software  is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
*/

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "rw.h"
int main(int argc, char *argv[]){
   int sockfd;
   int conn_ret;
   struct sockaddr_in servaddr;
   char cmd_buf[MAX_LEN];
   char recvbuf[MAX_LEN];
   int error_flag;
   int len = MAX_LEN;
   int file_fd;
   int dot_number;
   int total_len = 0;
   if(argc != 5){
      printf("Usage: fileclient <address> <port> <src file> <des file>\n");
      return 0;
   }
   if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1){
       perror("sock");
       exit(1);
   }
   bzero(&servaddr,sizeof(servaddr));
   servaddr.sin_family = AF_INET;
   servaddr.sin_port = htons(atoi(argv[2]));
   inet_pton(AF_INET,argv[1],&servaddr.sin_addr);
   conn_ret = connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
   if(conn_ret == -1){
      perror("connect");
   }
   file_fd = open(argv[4],O_CREAT |  O_WRONLY);
   if(file_fd == -1){
       perror("open");
       exit(1);
   }
   len = strlen(argv[3])+3;
   snprintf(cmd_buf,len,"%s\r\n",argv[3]);
   if((error_flag = writeall(sockfd,cmd_buf,&len))==-1){
       exit(1);
   }
   len = MAX_LEN;  	
   printf("\nfile is transferring:\n");
   while ((error_flag = readall(sockfd,recvbuf,&len))==0){
       if(len == 0){
           printf("\nClient has received file!\n");
           break;
       } 
       printf(".");
       printf("read length is %d\n",len);
       dot_number++;
       if((dot_number % DOT_PERIOD) ==0){
               printf("\n");
               dot_number = 0;
       }
       total_len+=len;
       if(writeall(file_fd,recvbuf,&len) == -1){
            printf("\nclient has some error when receive the file!\n");
            break;
       } 

       len  = MAX_LEN;
 
   }
   printf("\nRecevied %d bytes\n",total_len);
   close(file_fd);
   close(sockfd);
   return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -