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

📄 ac_ftp.c

📁 典型的FTP 源码.不算很漂亮,但是值得学习,
💻 C
📖 第 1 页 / 共 2 页
字号:
                 }
                 if (hDataFile != HFILE_ERROR || bToNul) {
                   /* Tell the Server where to connect back to us */
                   hLstnSock =
                     InitDataConn(&stDLclName, hDlg, WSA_ASYNC+1);
                   if (hLstnSock != INVALID_SOCKET) {
                      /* Queue PORT, TYPE and RETR cmds */
                     if (QueueFtpCmd(PORT, 0)) {
                       if (QueueFtpCmd (TYPE, "I"))  
                         QueueFtpCmd(RETR, szDataFile);
                     }
                   }
                 }
               }
             } else
               not_connected();
             break;
            
           case IDC_STOR:
             /* Prompt for name of local file to send */
             if (nAppState & CTRLCONNECTED) {
               bOk = DialogBoxParam (hInst, MAKEINTRESOURCE(IDD_FILENAME),
                 hDlg, Dlg_File, (LONG)(LPSTR)szDataFile);
                                                                   
               if (bOk && szDataFile[0]) {
                 if (!bFromNul) {
                   /* If user provided filename, try to open same name locally */
                   hDataFile = _lopen(szDataFile, 0);
                   if (hDataFile == HFILE_ERROR) {
                     wsprintf(achTempBuf, "Unable to open file: %s", szDataFile);
                     MessageBox (hWinMain, (LPSTR)achTempBuf,"File Error",  
                       MB_OK | MB_ICONASTERISK);
                   }
                 }
                 if (hDataFile != HFILE_ERROR || bFromNul) {
                   /* Tell the Server where to connect back to us */
                   hLstnSock =
                     InitDataConn(&stDLclName, hDlg, WSA_ASYNC+1);
                   if (hLstnSock != INVALID_SOCKET) {
                     /* Queue PORT, TYPE and STOR cmds */
                     if (QueueFtpCmd (PORT, 0)) {
                       if (QueueFtpCmd (TYPE, "I"))
                         QueueFtpCmd (STOR, szDataFile);
                     }                     
                   }
                 }
               }
             } else
               not_connected();
             break;
             
           case IDC_ABOR:
             if (hCtrlSock != INVALID_SOCKET)
               /* Abort the pending ftp command */
               QueueFtpCmd (ABOR, 0);
             break;
             
           case IDC_LCWD:
             /* Prompt for directory name, and move to it on local system. */
             bOk = DialogBoxParam (hInst, MAKEINTRESOURCE(IDD_FILENAME), 
                     hDlg, Dlg_File, (LONG)(LPSTR)szDataFile);
             
             if (bOk && szDataFile[0]) {
               if (!(_chdir (szDataFile))) {
                 getcwd (szDataFile, MAXFILENAME-1);
                 SetDlgItemText (hDlg, IDC_LPWD, szDataFile);
               }
             }
             break;
             
           case IDC_LDEL:
             /* Prompt for filename, and delete it from local system */
             bOk = DialogBoxParam (hInst, MAKEINTRESOURCE(IDD_FILENAME), 
                     hDlg, Dlg_File, (LONG)(LPSTR)szDataFile);

             if (bOk && szDataFile[0]) {
               /* If user provided filename, then delete it */
               remove (szDataFile);
             }
             break;
             
           case IDC_LDIR:
             /* Get local file directory, and display in notepad */
             if (GetLclDir(szTempFile)) {
               wsprintf (achTempBuf, "notepad %s", szTempFile);
               WinExec (achTempBuf, SW_SHOW);
             }             
             break;
        
           case IDC_RCWD:
             /* Prompt for directory name, and move to it on remote system. */
             if (nAppState & CTRLCONNECTED) {
               szDataFile[0] = 0;
               bOk = DialogBoxParam (hInst, MAKEINTRESOURCE(IDD_FILENAME), 
                 hDlg, Dlg_File, (LONG)(LPSTR)szDataFile);
             
               if (bOk && szDataFile[0]) {
                 QueueFtpCmd (CWD, szDataFile);
               }
             } else
               not_connected();
             break;
             
           case IDC_RDEL:
             /* Prompt for filename, and delete it from remote system */
             if (nAppState & CTRLCONNECTED) {
               szDataFile[0] = 0;
               bOk = DialogBoxParam (hInst, MAKEINTRESOURCE(IDD_FILENAME), 
                 hDlg, Dlg_File, (LONG)(LPSTR)szDataFile);
             
               if (bOk && szDataFile[0]) {
                 /* If user provided a filename, send command to delete it */
                 QueueFtpCmd (DELE, szDataFile);
               }
             } else
               not_connected();
             break;
                                                   
           case IDC_RDIR:
             /* Get remote file directory, and display in notepad file */
             if (nAppState & CTRLCONNECTED) {
               hDataFile = CreateLclFile (szTempFile);
               if (hDataFile != HFILE_ERROR) {
                 /* Prepare to receive the incoming connection from server */
                 hLstnSock =
                   InitDataConn(&stDLclName, hDlg, WSA_ASYNC+1);
                 if (hLstnSock != INVALID_SOCKET) {
                   if (QueueFtpCmd (PORT, 0))          /* Queue PORT, TYPE and LIST cmds */
                     if (QueueFtpCmd (TYPE, "A"))
                       QueueFtpCmd (LIST, 0);
                 }
               }
             } else 
               not_connected();
             break;
             
           case IDC_OPTIONS:
             DialogBox (hInst, MAKEINTRESOURCE(IDD_OPTIONS), 
                 hDlg, Dlg_Options);
             break;
             
           case IDABOUT:
             DialogBox (hInst, MAKEINTRESOURCE(IDD_ABOUT), hDlg, Dlg_About);
             break;

	       case WM_DESTROY:
           case IDC_EXIT:
             SendMessage (hDlg, WM_COMMAND, IDC_CLOSE, 0L);
             if (hLogFile != HFILE_ERROR) 
               _lclose(hLogFile);
             EndDialog(hDlg, msg);
             bRet = TRUE;
             break;
                       
           default:
              break;
         } /* end case WM_COMMAND: */
         break;
           
      case WM_INITDIALOG:
        hWinMain = hDlg;	/* save our main window handle */
        
        /* Assign an icon to dialog box */
#ifdef WIN32
        SetClassLong (hDlg, GCL_HICON, (LONG)        
          LoadIcon((HINSTANCE) GetWindowLong(hDlg, GWL_HINSTANCE),
          __TEXT("AC_FTP")));
#else
        SetClassWord(hDlg,GCW_HICON,(WORD)LoadIcon(hInst,MAKEINTRESOURCE(AC_FTP)));
#endif

        /* Initialize FTP command structure array */
        memset (astFtpCmd, 0, (sizeof(struct stFtpCmd))*MAX_CMDS);
        
        /* Display current working directory */
        getcwd (szDataFile, MAXFILENAME-1);
        SetDlgItemText (hDlg, IDC_LPWD, szDataFile);
        
        /* Open logfile, if logging enabled */
        if (bLogFile) {
          hLogFile = _lcreat (szLogFile, 0);
          if (hLogFile == HFILE_ERROR) { 
            MessageBox (hWinMain, "Unable to open logfile",
              "File Error", MB_OK | MB_ICONASTERISK);
            bLogFile = FALSE;
          }
        }
        /* Center dialog box */
        CenterWnd (hDlg, NULL, TRUE);
        break;
             
      default:
        break;
  } /* end switch (msg) */

  return (bRet);
} /* end Dlg_Main() */

/*---------------------------------------------------------------------
 * Function: Dlg_Login
 *
 * Description: Prompt for destination host, user name, and password
 */                                        
BOOL CALLBACK Dlg_Login (
  HWND hDlg,
  UINT msg,
  UINT wParam,
  LPARAM lParam)
{
   BOOL bRet = FALSE;
   lParam = lParam;  /* avoid warning */

   switch (msg) {
     case WM_INITDIALOG:
       SetDlgItemText (hDlg, IDC_SERVER, szHost);
       SetDlgItemText (hDlg, IDC_USERNAME, szUser);
       SetDlgItemText (hDlg, IDC_PASSWORD, szPWrd);
       CenterWnd (hDlg, hWinMain, TRUE);
       break;
     case WM_COMMAND:
       switch (wParam) {
         case IDOK:
           GetDlgItemText (hDlg, IDC_SERVER, szHost, MAXHOSTNAME);
           GetDlgItemText (hDlg, IDC_USERNAME, szUser, MAXUSERNAME);
           GetDlgItemText (hDlg, IDC_PASSWORD, szPWrd, MAXPASSWORD);
           EndDialog (hDlg, TRUE);
           bRet = TRUE;
           break;
         case IDCANCEL:
           EndDialog (hDlg, FALSE);
           bRet = FALSE;
           break;
         default:
           break;
       }
   }        
   return(bRet);
} /* end Dlg_Login */

/*---------------------------------------------------------------------
 * Function: Dlg_Options()
 *
 * Description: Allow user to change a number of run-time parameters
 *  that affect the operation, to allow experimentation and debugging.
 */                                        
BOOL CALLBACK Dlg_Options (
  HWND hDlg,
  UINT msg,
  UINT wParam,
  LPARAM lParam)
{
   BOOL bRet = FALSE;
   lParam = lParam;  /* avoid warning */

   switch (msg) {
     case WM_INITDIALOG:
       CheckDlgButton (hDlg, IDC_TO_NUL,  bToNul);
       CheckDlgButton (hDlg, IDC_FROM_NUL,bFromNul);
       CheckDlgButton (hDlg, IDC_LOGFILE, bLogFile);
       CheckDlgButton (hDlg, IDC_IOBEEP,  bIOBeep);
       CheckDlgButton (hDlg, IDC_REASYNC, bReAsync);
       CenterWnd (hDlg, hWinMain, TRUE);
       break;
       
     case WM_COMMAND:
       switch (wParam) {
         case IDC_TO_NUL:
           bToNul = !bToNul;
           break;
         case IDC_FROM_NUL:
           bFromNul = !bFromNul;
           break;
         case IDC_LOGFILE:
           bLogFile = !bLogFile;
           break;
         case IDC_IOBEEP:
           bIOBeep = !bIOBeep;
           break;
         case IDC_REASYNC:
           bReAsync = !bReAsync;
           break;
         case IDOK:
           if (bLogFile && hLogFile == HFILE_ERROR) {
             bLogFile = FALSE;
           } else if (!bLogFile && hLogFile != HFILE_ERROR) {
             _lclose(hLogFile);
             hLogFile = HFILE_ERROR;
           } else if (bLogFile && hLogFile == HFILE_ERROR) {
             hLogFile = _lcreat (szLogFile, 0);
             if (hLogFile == HFILE_ERROR) { 
               MessageBox (hWinMain, "Unable to open logfile",
                 "File Error", MB_OK | MB_ICONASTERISK);
               bLogFile = FALSE;
             }
           }
           EndDialog (hDlg, TRUE);
           bRet = TRUE;
           break;
       }
   }        
   return(bRet);
} /* end Dlg_Options() */

/*---------------------------------------------------------------
 * Function: not_connected()
 *
 * Description: tell the user that the client needs a connection.
 */
void not_connected(void) {
  MessageBox (hWinMain, "You need to connect to an FTP Server",
   "Not Connected",  MB_OK | MB_ICONASTERISK);
}

/*--------------------------------------------------------------
 * Function: CloseFtpConn()
 *
 * Description: Close the connection gracefully and robustly,
 *  reading all remaining data into buffer before closure.
 */
int CloseFtpConn(SOCKET *hSock, LPSTR achInBuf, int len, HWND hWnd)
{
  char achDiscard[BUF_SIZE];
  int nRet=0;
  
  if (*hSock != INVALID_SOCKET) {
    /* disable asynchronous notification if window handle provided */
    if (hWnd) {
      nRet = WSAAsyncSelect(*hSock, hWnd, 0, 0);
      if (nRet == SOCKET_ERROR)
        WSAperror (WSAGetLastError(), "CloseFtpConn() WSAAsyncSelect()", hInst);
    }
  
    /* Half-close the connection to close neatly */
    nRet = shutdown (*hSock, 1);
    if (nRet == SOCKET_ERROR) {
      WSAperror (WSAGetLastError(), "shutdown()", hInst);
    } else {
      /* Read and discard remaining data (until EOF or error) */
      nRet = 1;
      while (nRet && (nRet != SOCKET_ERROR)) {
        if (achInBuf) 
          nRet = RecvData(*hSock, hDataFile, achInBuf, len);
        else
          nRet = recv (*hSock, (LPSTR)achDiscard, BUF_SIZE, 0);
      }
      /* close the socket, and ignore any error 
       *  (since we can't do much about them anyway */
      closesocket (*hSock);
    }
    *hSock = INVALID_SOCKET;  /* we always invalidate socket */
  }
  return (nRet);
} /* end CloseFtpConn() */

⌨️ 快捷键说明

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