📄 ftpdatatrans.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 + -