FTP项目完整代码

ftpserve.c

#include<stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include"config.h"
#include<sys/stat.h>
#include<fcntl.h>

int get_cmd_type(char *cmd)
{
   if(!strcmp("ls",cmd))          return LS;
   if(!strcmp("pwd",cmd))         return PWD;
   if(!strcmp("quit",cmd))        return QUIT;
   if(strstr(cmd,"cd")!=NULL)    return CD;
   if(strstr(cmd,"get")!=NULL)   return GET;
   if(strstr(cmd,"put")!=NULL)   return PUT;

   return 100;
}

char *getdesdir(char *cmsg)
{
        char *p;
        p = strtok(cmsg," ");
        p = strtok(NULL," ");
        return p;
}

void msg_handler(struct Msg msg,int fd)
{
     char databuf[1024]={0};
     char *file = NULL;
     int fdfile;

     printf("cmd: %s\n",msg.data);
     int ret = get_cmd_type(msg.data);

 switch(ret){
           case LS:
           case PWD:
                    msg.type = 0;
                    FILE *r = popen(msg.data,"r");
                    fread(msg.data,sizeof(msg.data),1,r);
                    write(fd,&msg,sizeof(msg));

                    break;
           case CD:
                   msg.type = 1;
                   char *dir = getdesdir(msg.data);
                   printf("dir:%s\n",dir);
                   chdir(dir);    
                   //int chdir(const char *path);path:
                   //将进程的当前工作目录更改为 path 参数指定的目录,
                   //可以是绝对路径、也可以是相对路径,指定的目录必须要存在,否则会报错
                   break  ;

           case GET:
                   file = getdesdir(msg.data);
                   if(access(file,F_OK)==-1){
                      strcpy(msg.data,"NO THIS FILE");
                      write(fd,&msg,sizeof(msg));
                   }else{
                     msg.type = DOFILE;
                     fdfile = open(file,O_RDWR);
                     read(fdfile,databuf,sizeof(databuf));
                     close(fdfile);
                     strcpy(msg.data,databuf);
                     write(fd,&msg,sizeof(msg));
}
                   break;
                   
           case PUT:
                    fdfile = open(getdesdir(msg.data),O_RDWR|O_CREAT,0666);
                    write(fdfile,msg.secondbuf,strlen(msg.secondbuf));
                    close(fdfile);
                   break;
               
           case QUIT:
                    printf("quit");
                   exit(-1);
               }
}

int main(int argc,char **argv)
{
  int s_fd;
   int c_fd;
   int nread;
   char readbuf[128];
   struct Msg msg;
   struct sockaddr_in s_addr;
   struct sockaddr_in c_addr;

   if(argc != 3){
     printf("param error\n");
     exit(-1);
   }

   memset(&s_addr,0,sizeof(struct sockaddr_in));
   memset(&c_addr,0,sizeof(struct sockaddr_in));

   //socket
   s_fd = socket(AF_INET,SOCK_STREAM,0);
   if(s_fd == -1){
     perror("socket");
     exit(-1);
   }
   
   //bind
   s_addr.sin_family = AF_INET;
   s_addr.sin_port = htons(atoi(argv[2]));
   inet_aton(argv[1],&s_addr.sin_addr);
   bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
  
   //listen
   listen(s_fd,10);
   int clen = sizeof(struct sockaddr_in);
   while(1){
       c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&clen);
        if(c_fd == -1){
         perror("accept");
                  }else{
                     printf("get connect:%s\n",inet_ntoa(c_addr.sin_addr));
                       }
    if(fork()==0){
           while(1){
                 memset(msg.data,0,sizeof(msg.data));
                 nread = read(c_fd,&msg,sizeof(msg));
                 if(nread == 0){
                       printf("client out\n");
                       break;
                               }else if(nread> 0){
                                        msg_handler(msg,c_fd);
                                                 }
                }
                   }
            }
     close(c_fd);
     close(s_fd);
     return 0;
}

ftpclient.c

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
#include"config.h"

char * getdir(char *cmd)
{
       char *p;

       p = strtok(cmd," ");
       p = strtok(NULL," ");

       return p;
}

int get_cmd_type(char *cmd)
{
         if(strstr(cmd,"lcd"))  return LCD;

         if(!strcmp("quit",cmd))  return QUIT;
         if(!strcmp("ls",cmd))    return LS;
         if(!strcmp("lls",cmd))   return LLS;
         if(!strcmp("pwd",cmd))    return LS;

         if(strstr(cmd,"cd"))   return CD;
         if(strstr(cmd,"get"))  return GET;
         if(strstr(cmd,"put"))  return PUT;

         return  -1;
}

int cmd_handler(struct Msg msg,int fd)
{
        char *dir = NULL;
        char buf[32];
        int ret;
        int filefd;

        ret = get_cmd_type(msg.data);

        switch(ret){
               case LS:
               case CD:
               case PWD:
                        msg.type=0;
                        write(fd,&msg,sizeof(msg));
                        break;
               case GET:
                        msg.type =2;
                        write(fd,&msg,sizeof(msg));
                        break;
               case PUT:
                       strcpy(buf,msg.data);
                       dir = getdir(buf);

                      if(access(dir,F_OK)==-1){
                           printf("%s not exist\n",dir);
                                              }
                      else{
                          filefd = open(dir,O_RDWR);
                          read(filefd,msg.secondbuf,sizeof(msg.secondbuf));
                          close(filefd);

                          write(fd,&msg,sizeof(msg));
                          }
                          break;
                case LLS:
                        system("ls");

               case LCD:
                       dir = getdir(msg.data);
                       chdir(dir);
                       break;
               case QUIT:
                       strcpy(msg.data,"quit");
                       write(fd,&msg,sizeof(msg));
                       close(fd);
                       exit(-1);
                   }
               return ret;
}

void handler_server_message(int c_fd,struct Msg msg)
{
      int nread;
      struct Msg msgget;
      int newfilefd;

      nread = read(c_fd,&msgget,sizeof(msgget));
      if(nread == 0){
           printf("server is out,quit\n");
           exit(-1);
                   }
      else if(msgget.type == DOFILE){
              char *p = getdir(msg.data);
              newfilefd = open(p,O_RDWR|O_CREAT,0600);
              write(newfilefd,msgget.data,strlen(msgget.data));
              putchar('>');
              fflush(stdout);
                                    }
else{
           printf("----------------------\n");
           printf("\n%s\n",msgget.data);
           printf("----------------------\n");

           putchar('>');
           fflush(stdout);
          }
}

int main (int argc, char **argv)
{
    int c_fd;
    struct sockaddr_in c_addr;
    struct Msg msg;

    memset(&c_addr,0,sizeof(struct sockaddr_in));

    if(argc!=3){
          printf("param is error\n");
          exit(-1);
               }
               
    //1.scoket
    c_fd = socket(AF_INET,SOCK_STREAM,0);
     if(c_fd == -1){
              perror("socket");
              exit(-1);
                   }
      c_addr.sin_family = AF_INET;
      c_addr.sin_port = htons(atoi(argv[2]));
      inet_aton(argv[1],&c_addr.sin_addr);
      
 //2.connect
   if(connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr))==-1){
             perror("connect");
             exit(-1);
   }
     printf("connect ...\n");
     int mark = 0;
         while(1){
              memset(msg.data,0,sizeof(msg.data));
              if(mark == 0)   printf(">");

              gets(msg.data);

             if(strlen(msg.data)==0){
                if(mark == 1){
                      printf(">");
                             }
                      continue;
                                    }
                mark = 1;
                int ret = cmd_handler(msg,c_fd);
                if(ret>IFGO){
                    putchar('>');
                    fflush(stdout);
                    continue;
                                                }
               if(ret==-1){
                  printf("command not\n");
                  printf(">");
                  fflush(stdout);
                  continue;
                          }
               handler_server_message(c_fd,msg);
}
               return 0 ;
}

config.h

#define LS 0
#define GET 1
#define PWD 2

#define IFGO 3

#define LCD 4
#define LLS 5
#define CD 6
#define PUT  7

#define QUIT 8
#define DOFILE 9

struct msg 
{
    int type;
    char data[1024];
    char secondbuf[128];
}

知识点

fflush(stdout)
参考博文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
// FTPServer.h: interface for the CFTPServer class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_FTPSERVER_H__144E8B64_2004_4709_B55A_242FE5F07BD2__INCLUDED_) #define AFX_FTPSERVER_H__144E8B64_2004_4709_B55A_242FE5F07BD2__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "ConnectThread.h" #include "ListenSocket.h" #include "FTPEventSink.h" #include "UserManager.h" #include "SecurityManager.h" class CFTPServer : public CWnd { friend CConnectSocket; public: void SetGoodbyeMessage(LPCTSTR lpszText); void SetWelcomeMessage(LPCTSTR lpszText); void SetTimeout(int nValue); void SetPort(int nValue); void SetMaxUsers(int nValue); void SetStatisticsInterval(int nValue); BOOL IsActive(); void Stop(); BOOL Start(); CFTPServer(); virtual ~CFTPServer(); CUserManager m_UserManager; CSecurityManager m_SecurityManager; CCriticalSection m_CriticalSection; // list of thread pointers CTypedPtrList<CObList, CConnectThread*> m_ThreadList; int GetPort() { return m_nPort; }; int GetMaxUsers() { return m_nMaxUsers; } int GetTimeout() { return m_nTimeout; } int GetConnectionCount() { return m_nConnectionCount; } CString GetWelcomeMessage() { return m_strWelcomeMessage; }; CString GetGoodbyeMessage() { return m_strGoodbyeMessage; }; void AddTraceLine(int nType, LPCTSTR pstrFormat, ...); private: // socket member that listens for new connections CListenSocket m_ListenSocket; CFTPEventSink *m_pEventSink; int m_nPort; int m_nMaxUsers; CString m_strWelcomeMessage; CString m_strGoodbyeMessage; int m_nTimeout; BOOL m_bRunning; // statistics DWORD m_dwTotalReceivedBytes; DWORD m_dwTotalSentBytes; int m_nConnectionCount; int m_nTotalConnections; int m_nFilesDownloaded; int m_nFilesUploaded; int m_nFailedDownloads; int m_nFailedUploads; // Operations public: BOOL IsIPAddressAllowed(LPCTSTR lpszIPAddress); void SetSecurityMode(BOOL bBlockSpecific = TRUE); BOOL CheckMaxUsers(); void Initialize(CFTPEventSink *pEventSink); // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CFTPServer) //}}AFX_VIRTUAL // Generated message map functions protected: int m_nSecurityMode; int m_nStatisticsInterval; //{{AFX_MSG(CFTPServer) afx_msg void OnTimer(UINT nIDEvent); //}}AFX_MSG LRESULT OnThreadClose(WPARAM wParam, LPARAM lParam); LRESULT OnThreadStart(WPARAM wParam, LPARAM); LRESULT OnThreadMessage(WPARAM wParam, LPARAM lParam); DECLARE_MESSAGE_MAP() }; #endif // !defined(AFX_FTPSERVER_H__144E8B64_2004_4709_B55A_242FE5F07BD2__INCLUDED_)
以下是一个简单的 Java FTP 上传文件的代码示例: ```java import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class FtpUploadExample { public static void main(String[] args) { String server = "ftp.example.com"; int port = 21; String username = "ftp_user"; String password = "ftp_password"; String localFilePath = "/path/to/local/file.txt"; String remoteFilePath = "/path/to/remote/file.txt"; FTPClient ftpClient = new FTPClient(); try { ftpClient.connect(server, port); ftpClient.login(username, password); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); File localFile = new File(localFilePath); FileInputStream inputStream = new FileInputStream(localFile); ftpClient.storeFile(remoteFilePath, inputStream); inputStream.close(); ftpClient.logout(); ftpClient.disconnect(); System.out.println("文件上传成功!"); } catch (IOException e) { e.printStackTrace(); } } } ``` 请将上面的示例代码中的以下变量替换为实际的值: - `server`:FTP 服务器的主机名或 IP 地址 - `port`:FTP 服务器的端口,默认为 21 - `username`:FTP 登录的用户名 - `password`:FTP 登录的密码 - `localFilePath`:本地文件的路径(要上传的文件) - `remoteFilePath`:远程服务器上存储文件的路径 这段代码使用 Apache Commons Net 库来实现 FTP 功能,你需要将该库添加到项目依赖中。你可以从 Apache 的官方网站下载该库,并将其添加到项目中,或者使用构建工具(如 Maven、Gradle)来管理依赖。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值