⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ftpserver.c

📁 FTP的客户端与主机端程序源码
💻 C
字号:
/**********************FileServer.c******************************/#include<stdio.h>#include<stdlib.h>#include <unistd.h>#include<string.h>#include<sys/types.h>#include<sys/fcntl.h>#include <sys/stat.h>#include<sys/socket.h>#include<netinet/in.h>#include<netdb.h>#include <dirent.h>#include <time.h>#include<errno.h>#define BUFFER_SIZE  4096#define NAME_SIZE  200#define SERVER_PORT	1810#define TYPE_FILE	8static long long files_size=0;static u16	files_num=0,jump_count=0;int sumfile(char *flpath);int sumfile(char *flpath){	char pn[255];	struct dirent *pfile;	DIR	*pdir;	struct stat pfile_buf;	if ((pdir=opendir(flpath))== NULL)	{		printf("can't open directory");		//close(s);		return -1;	}	printf("准备传输目录文件\n");	while((pfile=readdir(pdir))!= NULL)	{		memset(pn,0,sizeof(pn));		if(!strcmp("..", pfile->d_name) || !strcmp(".", pfile->d_name))				{				jmp_count++;				continue;			}		if(pfile->d_type!=TYPE_FILE)				{				jmp_count++;				continue;//不为文件,则跳出			}		sprintf(pn,"%s%s%s",file_path,"/",pfile->d_name);		if(stat(pn,&pfile_buf)<0)			{				perror("获取文件信息失败\n");				return(-1);				}		files_num++;		files_size+=pfile_buf.st_size;	}		printf("准备传输的文件数目为%d\n",files_num);		printf("文件所需空间为:%d\n",files_size);		if(closedir(pdir)<0)			{				printf("关闭文件夹失败\n");				return(-1);			}		//printf("the pn string is :%s\n",pn);			return 0;}	//通过wifi实现文件或目录的ftp点对点传输,如果成功返回0,其它返回-1;int wlan2ftp(char * filepath;  ){	char c= 0;   char buf[BUFFER_SIZE];//读文件的缓冲   char file[NAME_SIZE];//文件名   int fromlen = 0,source = 0,on=1;   register int k,s,ns;   struct sockaddr_in sin;   struct hostent * hp;	DIR	*pdir;	struct dirent *pfile;	time_t	tend,tstart;	//clock_t	tend,tstart;		long timeess=0;	long int files_size=0;	unsigned int trans_count=0,i;	unsigned int jmp_count,files_num;	struct stat pfile_buf;	char *file_path="/root/ftpfile",pn[255];/*build socket connecting*/   if( (s = socket(AF_INET, SOCK_STREAM, 0)) < 0)	{      printf("获取SOCKET号失败!!!");      return(-1);	}	setsockopt(s,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));	//设定地址重用	printf("sock success!, sockfd=%d\n",s);   sin.sin_family=AF_INET;   sin.sin_port=htons(SERVER_PORT);	sin.sin_addr.s_addr=INADDR_ANY;	bzero(&(sin.sin_zero),8);   if(bind(s, (struct sockaddr*)&sin, sizeof(sin)) < 0 )        {      perror("不能将服务器地址捆绑到SOCKET号上!!!\n");      close(s);      return -1;        }/*listenning the port*/	if(listen(s,20) < 0)         {      fprintf(stderr, "sever:listen\n");		close(s);      		return -1;         }	memset(pn,0,sizeof(pn));	printf("sizeof pn%d",sizeof(pn));//遍历获得准备传输的文件数目及总size	if(sumfile(filepath)<0)	{		printf("read overroute failed\n");		close(s);		return -1;	}	//-------------------------------------------------------------------------------	for(i=0;i<255;i++)	{		pn[i]=0;	}	if ((pdir=opendir(file_path))== NULL)	{		printf("can't open directory");		close(s);		return -1;	}   while((pfile=readdir(pdir))!= NULL)          {		//if(pfile->d_ino==0) continue; //文件已删除		if(!strcmp("..", pfile->d_name) || !strcmp(".", pfile->d_name))				{				//jmp_count++;				continue;			}		if(pfile->d_type!=TYPE_FILE)				{				//jmp_count++;				continue;//不为文件,则跳出			}		sprintf(pn,"%s%s%s",file_path,"/",pfile->d_name);	printf("等待客户机请求\n");   	   if((ns = accept(s, NULL, NULL)) < 0 )	          {	      fprintf(stderr, "sever:accept\n");	      exit(6);	          }	   printf("输入要传输的文件名:");	   memset(file, 0, NAME_SIZE);		sprintf(file,pfile->d_name);		//printf("the file type code is:%d\n",pfile->d_type);		printf("准备传输文件%s\n",pn);	   //scanf("%s",file);	   if((source = open(pn, O_RDONLY)) < 0)	        {	  		perror("源文件打开出错");			close(ns);			close(s);	  		exit(1);	        }	//tstart=clock();      lseek(source,0L,0);      printf("开始传送文件.....\n");        	//先把文件名发过求      write(ns,file,sizeof(file));      printf("%s\n",pn);                  //发送文件名      memset(buf, 0, BUFFER_SIZE);      while((k = read(source, buf, sizeof(buf))) > 0)                   {                  //循环发送直到,文件结束         write(ns,buf,k);         memset(buf, 0, BUFFER_SIZE);                   }      printf("\n传输完毕\n");		//tend=clock();		//timeess+=(double)(tend-tstart)/CLOCKS_PER_SEC;		trans_count++;  		close(source);		close(ns);           }		tend=time(NULL);		printf("the current time is:%d\n",tend);		timeess=(long)(tend-tstart);		//timeess=(tend.tm_sec)-(tstart.tm_sec);	closedir(pdir); 	close(s);	printf("\n传输完成,共用时****%d秒****\n",timeess);	printf("共传输****%d****个文件\n",trans_count);	printf("共跳过%d个文件或目录\n",jmp_count);   exit(0);}  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -