📄 ftp_source.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <linux/stat.h>
#include <math.h>
#include <time.h>
#include <signal.h>
static char HostName[16];
static int hClient;
static int rcvtime = 1;
static int keepalive = 0;
static struct sockaddr_in SockAddr;
static int GetFtpSendBuf(char * Cmd, char * Entry, char * SendBuf,int SendBufLen)
{
char EndString[4]="\r\n";
int EntryLen;
EntryLen=strlen(Entry);
if(EntryLen==0)
return -1;
memset(SendBuf,0,SendBufLen);
sprintf(SendBuf,"%s ",Cmd);
strncat(SendBuf,Entry,EntryLen);
strncat(SendBuf,EndString,strlen(EndString));
return strlen(SendBuf);
}
static int WriteFile(int iHandle , char * FileName)
{
FILE *fp;
char RecvBuf[1024];
unsigned bufSize = 1024;
int RecvLen;
memset(RecvBuf,0,bufSize);
if((RecvLen=MyReceive(iHandle,RecvBuf,bufSize))>0)
{
fp=fopen(FileName,"wb");
if(fp!=NULL)
{
setlock( fileno(fp), F_WRLCK );
do {
//fprintf(fp,"%s",RecvBuf);
fwrite( RecvBuf, RecvLen, 1, fp );
fflush(fp);
memset(RecvBuf,0,bufSize);
RecvLen=MyReceive(iHandle,RecvBuf,bufSize);
} while (RecvLen>0);
setlock( fileno(fp), F_UNLCK );
fclose(fp);
}
}
else
return -1;
return 1;
}
void setlock(int fd, int type)
{
struct flock lock;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len =0;
while(1)
{
lock.l_type = type;
if((fcntl(fd, F_SETLK, &lock)) ==0)
return;
}
}
static int WriteRemoteFile( int hDataSocket, char * FileName )
{
register int c, d = 0;
char buf[BUFSIZ], *bufp;
int infile;
if ( ( infile = open( FileName,O_RDWR | O_CREAT, 0666 )) != -1 )
{
while ((c = read(infile, buf, sizeof (buf))) > 0)
{
for (bufp = buf; c > 0; c -= d, bufp += d)
{
if ((d = write( hDataSocket, bufp, c)) <= 0 )
{
break;
}
}
}
close( infile );
close( hDataSocket );
return 1;
}
else
return -1;
}
static int FtpClose()
{
close(hClient);
}
static int FtpMatchReceive(int hSocket, char * RecvBuf, char * MatchString,int RecvBufLen)
{
int RecvLen;
int flag=0;
int i;
for(i=0;i<3;i++)
{
memset(RecvBuf,0,RecvBufLen);
RecvLen=recv(hSocket,RecvBuf,RecvBufLen,0);
if (strstr(RecvBuf,MatchString)!=NULL)
{
flag=RecvLen;
break;
}
if(strstr(RecvBuf,"Login incorrect")!=NULL||strstr(RecvBuf,"login incorrect")!=NULL)
{
flag=-1;
break;
}
if(strstr(RecvBuf,"Permission denied")!=NULL||strstr(RecvBuf,"permission denied")!=NULL)
{
flag=-2;
break;
}
if(strstr(RecvBuf,"Password incorrect")!=NULL||strstr(RecvBuf,"password incorrect")!=NULL)
{
flag=-3;
break;
}
}
return flag;
}
static int SendFTPCommand(int hSocket, char * SendBuf)
{
char RecvBuf[200];
int ReturnCode;
if(send(hSocket,SendBuf,strlen(SendBuf),0)<0)
return -1;
memset(RecvBuf,0,200);
if(MyReceive(hSocket,RecvBuf,200)<=0)
return -1;
printf("%s\n", RecvBuf );
if((ReturnCode=GetReplyCode(RecvBuf))<0)
{
printf("GetReplyCode %d\n", GetReplyCode );
return -1;
}
return(ReturnCode);
}
static int MyReceive(int hSocket, char * RecvBuf,int RecvBufLen)
{
int RecvLen=0;
int i;
for(i=0;i<1;i++)
{
RecvLen=recv(hSocket,RecvBuf,RecvBufLen,0);
if(RecvLen>1)
break;
}
return RecvLen;
}
static int GetReplyCode(char * RecvBuf)
{
char cStr[4];
int nCode;
memset( cStr, 0, 4);
if(*RecvBuf<'0'||*RecvBuf>'9'||*(RecvBuf+1)<'0'||*(RecvBuf+1)>'9'||*(RecvBuf+2)<'0'||*(RecvBuf+2)>'9')
return -1;
memcpy(cStr,RecvBuf,3);
return atoi(cStr);
}
static int CreatListenSocket(int hControlSocket)
{
int hListenSocket;
struct sockaddr_in ListSockAddr;
hListenSocket=socket(AF_INET,SOCK_STREAM,0);
if(hListenSocket<0)
return -1;
ListSockAddr.sin_family=AF_INET;
ListSockAddr.sin_port=htons(0);
ListSockAddr.sin_addr.s_addr=INADDR_ANY;
if(bind(hListenSocket,(struct sockaddr *)&ListSockAddr,sizeof(ListSockAddr)))
return -1;
if(listen(hListenSocket,5))
{
close(hListenSocket);
return -1;
}
return hListenSocket;
}
static int RequestDataConnection(int hControlSocket,int hListenSocket)
{
struct sockaddr_in RequestSockAddr,LocalSockAddr;
unsigned int SourcePort;
char IpBuf[100];
char SendBuf[100];
int SockNameLen;
int ReturnCode;
int i;
SockNameLen=sizeof(RequestSockAddr);
memset(&RequestSockAddr,0,sizeof(RequestSockAddr));
if(getsockname(hListenSocket,(struct sockaddr * )&RequestSockAddr,&SockNameLen))
return -1;
SourcePort=htons(RequestSockAddr.sin_port);
memset(SendBuf,0,100);
if(getsockname(hControlSocket,(struct sockaddr * )&RequestSockAddr,&SockNameLen))
return -1;
sprintf( IpBuf, "%s", inet_ntoa( RequestSockAddr.sin_addr ) );
for ( i=0; i<strlen(IpBuf); i++ )
{
if ( IpBuf[i] == '.' ) IpBuf[i] = ',';
}
sprintf(SendBuf,"PORT %s,%d,%d\r\n", IpBuf, SourcePort/256,SourcePort%256);
printf("%s\n", SendBuf );
/* sprintf(SendBuf,"PORT %d,%d,%d,%d,%d,%d\r\n",
SockAddr.sin_addr.S_un.S_un_b.s_b1,
SockAddr.sin_addr.S_un.S_un_b.s_b2,
SockAddr.sin_addr.S_un.S_un_b.s_b3,
SockAddr.sin_addr.S_un.S_un_b.s_b4,
SourcePort/256,SourcePort%256);
*/
ReturnCode=SendFTPCommand(hControlSocket,SendBuf);
if(ReturnCode!=200)
{
printf("The Return Code of SendFTPCommand = %d\n",ReturnCode);
close(hListenSocket);
return -1;
}
return 1 ;
}
static int AcceptDataConnection(int hListenSocket)
{
int hDataSocket;
struct sockaddr_in AcceptSockAddr;
int SockAddLen;
SockAddLen=sizeof(AcceptSockAddr);
memset(&AcceptSockAddr,0,SockAddLen);
hDataSocket=accept(hListenSocket,(struct sockaddr *)&AcceptSockAddr,&SockAddLen);
close(hListenSocket);
if(hDataSocket<0)
return -1;
return hDataSocket;
}
/*
int GetFileName(struct sockaddr_in SockAddr, char * Suffix,char *FileName)
{
char CurrentDirectory[256];
strcat(CurrentDirectory,"");
SetDataDirectory(CurrentDirectory);
sprintf(FileName,"%s%d_%d_%d_%d.%s",
CurrentDirectory,
SockAddr.sin_addr.s_un.S_un_b.s_b1,
SockAddr.sin_addr.S_un.S_un_b.s_b2,
SockAddr.sin_addr.S_un.S_un_b.s_b3,
SockAddr.sin_addr.S_un.S_un_b.s_b4,
Suffix);
return 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -