fileclient.c

来自「在LINUX下的一个多线程的服务器和客户端的网络传输程序」· C语言 代码 · 共 87 行

C
87
字号
/* 
 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 + =
减小字号Ctrl + -
显示快捷键?