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