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

📄 ftp.c

📁 本程序为在linux下实现FTP传输文件的实现
💻 C
字号:
#include "ftp.h"#include "inc.h"#include <sys/socket.h>#include <sys/ioctl.h>#include <net/if.h>#include <net/if_arp.h>#include <arpa/inet.h>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;}

⌨️ 快捷键说明

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