Linux下基于C实现的socket简单文件下载实例

此实例是客户端向服务器端下载文件:

服务器端代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>

#define FD_SERVER_PORT 8088 /*set port*/
#define FD_BUFFERSIZE 1024 /*set buffer size*/
#define FD_LISTENQ 10   /*set listen max conncent*/

int main(int argc,char *argv[])
{
int fd_listenfd,fd_connfd,fd_filefd; /*descriptor*/
int fd_read,fd_write;
int struct_size;
struct sockaddr_in fd_servaddr,fd_cliaddr;
char *fd_filename;
char *p;
char buffer[FD_BUFFERSIZE];

fd_listenfd=socket(AF_INET,SOCK_STREAM,0); /*create socket*/
if(fd_listenfd==-1){
   perror("fd_socket");
   exit(1);
}

memset(&fd_servaddr,0,sizeof(fd_servaddr)); /*servaddr set 0*/

fd_servaddr.sin_family=AF_INET;    /*init serveraddr*/
fd_servaddr.sin_addr.s_addr=INADDR_ANY;
fd_servaddr.sin_port=htons(FD_SERVER_PORT);

/*bind fd_listenfd*/

if(-1==(bind(fd_listenfd,(struct sockaddr *)&fd_servaddr, sizeof(fd_servaddr)))){
   perror("fd_bind");
   exit(1);
}

/*listen fd_listenfd*/
if(-1==(listen(fd_listenfd,FD_LISTENQ))){
   perror("fd_listen");
   exit(1);
}

/*file download server start*/
while(1){
   printf("file download server starting......\n");

   memset(&fd_cliaddr,0,sizeof(fd_cliaddr));
   struct_size=sizeof(fd_cliaddr);

   fd_connfd=accept(fd_listenfd,(struct sockaddr *)&fd_cliaddr,&struct_size);
   if(-1==fd_connfd){
    perror("fd_accpet");
    continue;
   }

   fd_filename="/root/tmp.txt";
   printf("will download file name is:%s\n",fd_filename);
   fd_filefd=open(fd_filename,O_RDONLY);
   if(-1==fd_filefd){
    perror("open will download file");
    continue;
   }
   while(fd_read=read(fd_filefd,buffer,FD_BUFFERSIZE)){
    if(-1==fd_read){
     perror("read will download file");
     break;
    }

    p=buffer;
    while(fd_write=write(fd_connfd,p,fd_read)){
     if(-1==fd_write){
      perror("write client file");
      break;
     }
     else if(fd_read==fd_write) break;
     else if(fd_write>0){
      p+=fd_write;
      fd_read-=fd_write;   
     }
    }
   }
   if(-1==fd_read||-1==fd_write) continue;
   close(fd_filefd);
   close(fd_connfd);
   printf("file already is downloaded!\n");
}
close(fd_listenfd);
return 0;
}

客户端代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>

#define FD_SERVER_PORT 8088 /*set port*/
#define FD_BUFFERSIZE 1024 /*set buffer size*/

int main(int argc,char *argv[])
{
int fd_sockfd,fd_filefd; /*descriptor*/
int fd_read,fd_write;
int struct_size;
struct sockaddr_in fd_sockaddr;
char *fd_filename;
char *p;
char buffer[FD_BUFFERSIZE];

if (argc!=2) {
   perror("fd_Usage: <./client> <server IP>\n");
   exit(1);
}
fd_sockfd=socket(AF_INET,SOCK_STREAM,0); /*create socket*/
if(fd_sockfd==-1){
   perror("fd_socket");
   exit(1);
}

memset(&fd_sockaddr,0,sizeof(fd_sockaddr)); /*servaddr set 0*/

fd_sockaddr.sin_family=AF_INET;    /*init serveraddr*/
inet_aton(argv[1],&fd_sockaddr.sin_addr);
fd_sockaddr.sin_port=htons(FD_SERVER_PORT);

if(-1==(connect(fd_sockfd,(struct sockaddr *)&fd_sockaddr,sizeof(fd_sockaddr)))){
   perror("fd_connect");
   exit(1);
}
printf("start connecting..........\n");

fd_filename="./backup.txt";
fd_filefd=open(fd_filename,O_RDWR|O_CREAT|O_TRUNC,S_IRWXU);
if (-1==fd_filefd) {
   perror("open the backup file");
   exit(1);
}
while(fd_read=read(fd_sockfd,buffer,FD_BUFFERSIZE)) {
   if(-1==fd_read){
    perror("read server file");
    exit(1);
   }

   /*p is used to wirte error*/
   p=buffer;
   while(fd_write=write(fd_filefd,p,fd_read)){
    if(-1==fd_write){
     perror("write localhost file");
     exit(1);
    }
    else if(fd_read==fd_write) break;
    else if(fd_write>0){
     p+=fd_write;
     fd_read-=fd_write;
    }
   }
}
close(fd_filefd);
close(fd_sockfd);
printf("finsh file download!\n");
return 0;

}

原文地址:https://www.cnblogs.com/zzxap/p/2175801.html