此实例是客户端向服务器端传送文件
服务器端代码实现:
#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");
}