www.pudn.com > ftp.rar > ftp.c


#include "ftp.h"

#include "inc.h"
#include 
#include 
#include 
#include 
#include 

int FTPSendCmd(int SocketFD, const char* Cmd)
{
    int		Ret;
    char	Val[4];

    if ((Ret = send(SocketFD, Cmd, strlen(Cmd), 0)) == -1)
	perror("Send FTP Cmd");

    printf("Send Command is: %s\n", Cmd);
    memset(RecvBuf, 0, sizeof(RecvBuf));
    if ((Ret = recv(SocketFD, RecvBuf, sizeof(RecvBuf), 0)) == -1)
	perror("ftp recv cmd return");

    printf("RecvText from Server is: %s\n", RecvBuf);
    strncpy(Val, RecvBuf, 3);
    Val[3] = '\0';
    Ret = atoi(Val);
    printf("Recv value from Server is: %d\n", Ret);
    return Ret;
}

int FTPConnServer(const char* ServIp, const char* User, const char* Pass)
{
    int		Ret;
    char	CmdBuf[64];
    if ((SocketFD = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
	perror("ftp connect error");
	return -1;
    }
    bzero(&CmdBuf, sizeof(ServAddr));
    ServAddr.sin_family	= AF_INET;
    ServAddr.sin_port	= htons(21);
    ServAddr.sin_addr.s_addr = inet_addr(ServIp);
    bzero(&(ServAddr.sin_zero), 8);


    if (connect(SocketFD, (struct sockaddr*)&ServAddr, sizeof(ServAddr)) < 0)
    {
	perror("Begin Connect!");
	return -1;
    }

    if ((recv(SocketFD, RecvBuf, sizeof(RecvBuf), 0)) == -1)
	perror("Connect Failed!");
    else
	printf("SERVER: %s\n", RecvBuf);
    sprintf(CmdBuf,"USER %s\r\n", User);
    Ret = FTPSendCmd(SocketFD, CmdBuf);
    sprintf(CmdBuf, "PASS %s\r\n", Pass);
    Ret = FTPSendCmd(SocketFD, CmdBuf);
    sprintf(CmdBuf, "TYPE I\r\n");
    Ret = FTPSendCmd(SocketFD, CmdBuf);
    FTPStatus = FTP_CONN;
    return 0;
}

int FTPDownFile(const char* ServerPathStr, const char* ClientPathStr, const char* FileName)
{
    int i, Ret, RecvEnd;
    int DataSocket, DataPort;
    int RecvLen, FileSize;
    char *Val, *TmpBuf;
    char DataBuf[1024], CmdBuf[128];
    char ServerFileName[128], ClientFileName[128];
    FILE *fp;
    struct stat File;
    struct sockaddr_in Data_Addr;

    if (FTPStatus != FTP_CONN)
	return -1;

    sprintf(ClientFileName, "%s/%s", ClientPathStr, FileName);
    if ((Ret = stat(ClientPathStr, &File)) == -1)
	FileSize = 0;
    else
	FileSize = File.st_size;
    if ((fp = fopen(ClientFileName, "a")) == NULL) {
	perror("Open Client File Failed!");
	return -1;
    }
    fseek(fp, 0, SEEK_END);

    Ret = FTPSendCmd(SocketFD, "PASV\r\n");
    //Ret = FTPSendCmd(SocketFD, "PORT 192,168,0,47,4,55\r\n");

    if (Ret != 227)
	return -1;
    Val = strtok(RecvBuf, ",");
    for (i = 0; i < 4; i++)
	Val = strtok(NULL, ",");
    DataPort = atoi(Val);
    Val = strtok(NULL, ")");
    DataPort = DataPort * 256 + atoi(Val);
    printf("DataPort is %d\n", DataPort);

    if ((DataSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
	perror("socket");
	return -1;
    }
    memcpy(&Data_Addr, &CmdBuf, sizeof(Data_Addr));
    Data_Addr.sin_port = htons(DataPort);
    if (connect(DataSocket, (struct sockaddr*)&Data_Addr, sizeof(Data_Addr)) < 0)
    {
	perror("DataPort Connect");
	return -1;
    }
    sprintf(CmdBuf, "REST %d\r\n", FileSize);
    Ret = FTPSendCmd(SocketFD, CmdBuf);
    sprintf(ServerFileName, "%s/%s", ServerPathStr, FileName);
    sprintf(CmdBuf, "RETR %s\r\n", ServerFileName);
    Ret = FTPSendCmd(SocketFD, CmdBuf);
    if (Ret == 150) {
	RecvEnd = 0;
	TmpBuf = strchr(RecvBuf, '\n');
	TmpBuf++;
	if (strcmp(TmpBuf, "")) {
	    Val = strtok(TmpBuf, " ");
	    if (!strcmp(Val, "226"))
		RecvEnd = 1;
	}
	FTPStatus = FTP_TRAN;
	do {
	    do {
		RecvLen = recv(DataSocket, DataBuf, sizeof(DataBuf), 0);
		if (RecvLen == -1) {
		    perror("FTP Recv Data");
		    break;
		}
		else if(RecvLen == 0) {
		    if (RecvEnd == 1)
			goto DownFileEnd;
		    else
			break;
		}
		else {
		    fwrite(DataBuf, 1, RecvLen, fp);
		    fflush(fp);
		    //don't added
		    //	CheckTime(1);
		}
	    } while(FTPStatus == FTP_TRAN);
	    if (FTPStatus == FTP_STOP)
		break;
	    if (recv(SocketFD, RecvBuf, sizeof(RecvBuf), 0) == -1)
		perror("FTP Recv Cmd");
	    printf("SERVER:%s", RecvBuf);
	    Val = strtok(RecvBuf, " ");
	    if (!strcmp(Val, "226"))
		RecvEnd = 1;
/*
	    if (CheckTime(0) == 0)
		break;*/
	} while(FTPStatus == FTP_TRAN);

	if (FTPStatus == FTP_STOP) {
	    Ret = FTPSendCmd(SocketFD, "ABOR\r\n");
	}
    }
DownFileEnd:
    FTPStatus = FTP_CONN;
    fclose(fp);
    //ShutDown(DataSocket, 0);
    return 0;
}

int FTPUPFile(const char* ServerPathStr, const char* ClientPathStr, const char* FileName)
{
    int i, Ret, FileOffset;
    int DataSocket, DataPort;
    int SendLen, RecvLen;
    char *Val, *TmpPtr, *CurPtr, *NextPtr;
    char DataBuf[1024], CmdBuf[128], TmpBuf[1200];
    char ClientFileName[128];
    FILE *fp;
    struct sockaddr_in Data_Addr;
    //FTPFiledis fdis;

    if (FTPStatus != FTP_CONN)
	return -1;
    Ret = FTPSendCmd(SocketFD, "PASV\r\n");
    if (Ret != 227)
	return -1;
    Val = strtok(RecvBuf, ",");
    for (i = 0; i < 4; i++)
	Val = strtok(NULL, ",");
    DataPort = atoi(Val);
    Val = strtok(NULL, ")");
    DataPort = DataPort * 256 + atoi(Val);
    if ((DataSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
	perror("socket");
	return -1;
    }
    memcpy(&Data_Addr, &ServAddr, sizeof(Data_Addr));
    Data_Addr.sin_port = htons(DataPort);
    if (connect(DataSocket, (struct sockaddr*)&Data_Addr, sizeof(Data_Addr)) < 0) {
	perror("DataPort Connect");
	return -1;
    }
    sprintf(CmdBuf, "CWD %s\r\n", ServerPathStr);
    Ret = FTPSendCmd(SocketFD, CmdBuf);
    sprintf(CmdBuf, "LIST \r\n");
    Ret = FTPSendCmd(SocketFD, CmdBuf);
    memset(TmpBuf, 0, sizeof(TmpBuf));
    FileOffset = 0;
    do {
	RecvLen = recv(DataSocket, DataBuf, sizeof(DataBuf), 0);
	if (RecvLen == -1) {
	    perror("FTP Recv Data");
	    break;
	}
	else if (RecvLen == 0) {
	    //if (CheckTime(0) == )
		break;
	}
	else {
	    printf("%s", DataBuf);
	    strcat(TmpBuf, DataBuf);
	    CurPtr = TmpBuf;
	    TmpPtr = strchr(TmpBuf, '\n');
	    while (TmpPtr != NULL) {
		*TmpPtr = '\0';
		NextPtr = (char *)(TmpPtr + 1);
		if (strcmp(CurPtr, "") != 0) {
/*
		    sscanf(this, "%s%d%s%s%d%s%d%s%s", &fdis.prior, &fdis.usern, &fdis.username,
			   &fdis.groupname, &fdis.filesize, &fdis.date, &fdis.day, &fdis.time,
			   &fdis.filename); 
		    if (strcmp(fdis.filename.filename) == 0) {
			FileOffset = fdis.filesize;
			goto FindOffset;
			}*/
		}
		CurPtr = NextPtr;
		TmpPtr = strchr(CurPtr, '\n');
	    }
	    strcpy(TmpBuf, CurPtr);
	}
    } while(FTPStatus == FTP_TRAN);

 //FindOffset:
    if (recv(SocketFD, RecvBuf, sizeof(RecvBuf), 0) == -1)
	perror("FTP Recv Cmd");
    printf("SERVER:%s", RecvBuf);
    //ShutDown(DataSocket, 1);
    close(DataSocket);

    printf("FILEOFFSET is %d\n", FileOffset);
    Ret = FTPSendCmd(SocketFD, "PASV\r\n");
    if (Ret != 227)
	return -1;
    Val = strtok(RecvBuf, ",");
    for (i = 0; i < 4; i++)
	Val = strtok(NULL, ",");
    DataPort = atoi(Val);
    Val = strtok(NULL, ")");
    DataPort = DataPort * 256 + atoi(Val);
    if ((DataSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
	perror("Socket");
	return -1;
    }

    memcpy(&Data_Addr, &ServAddr, sizeof(Data_Addr));
    Data_Addr.sin_port = htons(DataPort);
    if (connect(DataSocket, (struct sockaddr*)&Data_Addr, sizeof(Data_Addr)) < 0) {
	perror("DataPort Connect");
	return -1;
    }
    sprintf(ClientFileName, "%s/%s", ClientPathStr, FileName);
    fp = fopen(ClientFileName, "rb");
    fseek(fp, FileOffset, SEEK_SET);
    sprintf(CmdBuf, "REST %d\r\n", FileOffset);
    Ret = FTPSendCmd(SocketFD, CmdBuf);
    sprintf(CmdBuf, "STOR %s\r\n", FileName);
    Ret = FTPSendCmd(SocketFD, CmdBuf);
    if (Ret != 150)
	return -1;
    FTPStatus = FTP_TRAN;
    while (!feof(fp) && (FTPStatus == FTP_TRAN)) {
	SendLen = fread(DataBuf, 1, sizeof(DataBuf), fp);
	if (SendLen == -1) {
	    perror("FTP Send Data");
	    break;
	}
	else {
	    Ret = send(DataSocket, DataBuf, SendLen, 0);
	    if (Ret == -1) {
		perror("Up File Failed!");
		break;
	    }
	}
    }
    //ShutDown(DataSocket, 1);
    close(DataSocket);
    if (recv(SocketFD, RecvBuf, sizeof(RecvBuf), 0) == -1)
	perror("FTP Recv Cmd");
    printf("SERVER:%s", RecvBuf);
    Val = strtok(RecvBuf, " ");
    if (!strcmp(Val, "226"))
	goto ReturnRoot;
    if (FTPStatus == FTP_STOP) {
	Ret = FTPSendCmd(SocketFD, "ABOR\r\n");
	return -1;
    }
 ReturnRoot:
    FTPStatus = FTP_CONN;
    fclose(fp);

    sprintf(CmdBuf, "CWD %s\r\n", "/");
    Ret = FTPSendCmd(SocketFD, CmdBuf);
    return 0;
}

int FTPDisConn()
{
    if (FTPStatus == FTP_TRAN)
	FTPStatus = FTP_STOP;
    if (FTPStatus == FTP_CONN) {
	//ShutDown(SocketFD, 2);
	close(SocketFD);
	FTPStatus = FTP_IDLE;
    }
    FTPSendCmd(SocketFD, "QUIT\r\n");
    return 0;
}

int main()
{
    FTPConnServer("210.75.28.56", "mis5", "mis5");
    //FTPConnServer("192.168.0.144", "liangrh", "liangrh");
    //FTPDownFile("media","/bus/media","zhu25.mpg");
    FTPDownFile("m1", "./", "test.mp3"); 
    //FTPDownFile("/home/maop/nfs_root/bus/station", "/mnt/fatd/prog/ftp", "test.mp3");
    return 1;
}