📄 ac_ftp.c
字号:
}
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 + -