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

📄 ftpdatatrans.c

📁 模拟linux平台下边的vsFtp服务器可以实现文件的断点续传和下载
💻 C
字号:


#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include "ftpnet.h"
#include "ftppub.h"
#define TRANS_DATA_MAX 1024 //定义每次数据传输的最大字节数
//#define 0666 ( (S_IWUSR|S_IRUSR) | (S_IRGRP|S_IWGRP) | (S_IROTH|S_IWOTH) )
//向客户端发送数据
int Send_Data(int socket,char * fileName)
{
	int fileSize=0,readCount=0,writeCount=0;
	int fd;

	//int upspeed=20;//限制每秒上传20K
	int i=0;

	char buff[TRANS_DATA_MAX]={0};
	struct stat file_stat;

	
	fd=open(fileName,O_RDONLY);
			
	if(fd<0)
	{
		Respond(550,"Failed to open file.");
		return -1;
	}
	else
	{


		if(stat(fileName,&file_stat)==0)
		{
			Respond(150,"Opening BINARY mode data connection for %s (%d bytes).",fileName,file_stat.st_size);	
		}
		if(transfers_mode==2)
		{
			lseek(fd,offset,SEEK_SET);//在REST命令后,
			offset=0;//在进行偏移后,要把偏移量重新置成0,以便后边可以继续传文件
		}
	}
	while((readCount=read( fd,buff,sizeof(buff) )) >0)
	{
		//printf("数据传输的套接字是%d ,读取了%d个字节\n",socket,readCount);
		fileSize+=readCount;

		if( (writeCount=write(socket,buff,readCount)) != readCount )
		{
			//printf("下载数据出错..........传输了%d\n",writeCount);
			//printf("到目为止发送了%d个字节\n",g_segptr->downsize);
			close(fd);
			return -1;
		}

		//g_segptr->downsize+=readCount;//将共享内存中的值下载字节数进行修改
		//printf("当前发送了[ %d ]个字节到目为止发送了[ %d ]个字节\n",writeCount,g_segptr->downsize);
		
		Down_Size(writeCount);

		memset(buff,0,sizeof(buff));

		if(downspeed!=0 && i++ == downspeed)
		{
			sleep(1);
			i=0;
		}
	}		
	//g_segptr->downsize+=file_stat.st_size;//将共享内存中的值下载字节数进行修改
	
	//g_segptr->downtotal++;//将共享内存中的值下载文件个数
	Down_Total(1);
	transfers_mode=0;//在传输完把传输模式变成标准模式

//	printf("11111111111111fffffffffffff\n");

	close(fd);
	return 1;
}


//从客户端接收数据
int Accept_Data(int socket,char * fileName)
{
	int fileSize=0,readCount=0;
	int fd;
	//int upspeed=20;//限制每秒上传20K
	int i=0;
//	struct stat file_stat;
	char buff[TRANS_DATA_MAX]={0};

	if(transfers_mode==0)//普通传输模式
	{
		fd=open(fileName,O_RDWR|O_CREAT|O_TRUNC,(S_IWUSR|S_IRUSR) | (S_IRGRP|S_IWGRP) | (S_IROTH|S_IWOTH));//这里O_TRUNC这个
	}
	if(transfers_mode==1) //APPE续传模式
	{
		fd=open(fileName,O_RDWR|O_APPEND);//这里O_TRUNC这个
	}
	if(transfers_mode==2) //SERT续传模式
	{
		if(offset==0)
		{
			fd=open(fileName,O_RDWR|O_CREAT|O_TRUNC,(S_IWUSR|S_IRUSR) | (S_IRGRP|S_IWGRP) | (S_IROTH|S_IWOTH));//这里O_TRUNC这个
		}
		else if(offset>0)
		{
			fd=open(fileName,O_RDWR,0666);//这里O_TRUNC这个
		}
		lseek(fd,offset,SEEK_SET);//这个函数的作用是偏移到指定位置  lseek这个函数是针对文件描述符进行偏移 fseek函数是针对文件指针进行偏移
		offset=0;
	}
	if(fd<0)
	{
		Respond(550,"Failed to open file.");
		return -1;
	}
	else
	{
		Respond(150,"Ok to send data.");	
	}
	while((readCount=read(socket,buff,TRANS_DATA_MAX)) >0)
	{
		//printf("读取了%d个字节\n",readCount);
		fileSize+=readCount;
		//printf("mmmmmmmmmmmmmmsocket=%d\n",socket);
		if(write(fd,buff,readCount)<0)
		{
			close(fd);
			return -1;
		}
		//printf("写了%d个字节\n",readCount);

		//g_segptr->upsize+=readCount;


		Up_Size(readCount);

		memset(buff,0,sizeof(buff));



		if(upspeed!=0 && i++ == upspeed)
		{
			sleep(1);
			i=0;
		}



	}

	//stat(fileName,&file_stat);
	//g_segptr->upsize+=file_stat.st_size;
	//g_segptr->uptotal++;

	Up_Total(1);

	transfers_mode=0;//在传输完把传输模式变成标准模式
	close(fd);
	return 1;
}

⌨️ 快捷键说明

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