您的位置:首页 > 运维架构 > Linux

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

2010-05-17 10:27 761 查看
此实例是客户端向服务器端下载文件:

服务器端代码实现:

#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: