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 FU_SERVER_PORT 8080 /*set port*/
#define FU_BUFFERSIZE 1024 /*set buffer size*/
#define FU_LISTENQ 10   /*set listen max conncent*/

int main(int argc,char *argv[])
{
int fu_listenfd,fu_connfd,fu_filefd; /*descriptor*/
int fu_read,fu_write;
int struct_size;
struct sockaddr_in fu_servaddr,fu_cliaddr;
char *fu_filename;
char *p;
char buffer[FU_BUFFERSIZE];

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

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

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

/*bind fu_listenfd*/

if(-1==(bind(fu_listenfd,(struct sockaddr *)&fu_servaddr, sizeof(fu_servaddr)))){
   perror("fu_bind");
   exit(1);
}

/*listen fu_listenfd*/
if(-1==(listen(fu_listenfd,FU_LISTENQ))){
   perror("fu_listen");
   exit(1);
}

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

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

   fu_connfd=accept(fu_listenfd,(struct sockaddr *)&fu_cliaddr,&struct_size);
   if(-1==fu_connfd){
    perror("fu_accpet");
    continue;
   }

   fu_filename="/root/backup.txt";
   printf("will upload file name is:%s\n",fu_filename);

   fu_filefd=open(fu_filename,O_RDWR|O_CREAT|O_TRUNC,S_IRWXU);
   if (fu_filefd<0) {
    perror("open localhost file");
    continue;
   }

   while(fu_read=read(fu_connfd,buffer,FU_BUFFERSIZE)) {
    if (fu_read< 0) {
     perror("read client file");
     break;
    }
    if (-1==write(fu_filefd,buffer,fu_read)) {
     perror("writing to filefd error");
     break;
    }
   }
   if(-1==fu_read||-1==fu_write) continue;
   close(fu_filefd);
   close(fu_connfd);
   printf("file upload success!\n");
}
close(fu_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 FU_SERVER_PORT 8080 /*set port*/
#define FU_BUFFERSIZE 1024 /*set buffer size*/

int main(int argc,char *argv[])
{
int fu_sockfd,fu_filefd; /*descriptor*/
int fu_read,fu_write;
int struct_size;
struct sockaddr_in fu_sockaddr;
char *fu_filename;
char *p;
char buffer[FU_BUFFERSIZE];

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

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

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

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

fu_filename="./will.txt";
printf("will upload file name is:%s\n",fu_filename);
fu_filefd=open(fu_filename,O_RDONLY);
if(-1==fu_filefd){
   perror("open will upload file");
   exit(1);
}
while(fu_read=read(fu_filefd,buffer,FU_BUFFERSIZE)){
   if(-1==fu_read){
    perror("read will upload file");
    exit(1);
   }

   p=buffer;
   while(fu_write=write(fu_sockfd,p,fu_read)){
    if(-1==fu_write){
     perror("write client file");
     break;
    }
    else if(fu_read==fu_write) break;
    else if(fu_write>0){
     p+=fu_write;
     fu_read-=fu_write;   
    }
   }
   if(-1==fu_write) exit(1);
}
close(fu_filefd);
close(fu_sockfd);
printf("file already is uploaded!\n");

}

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