敬业的IT人 >> 编程开发 >> C++Builder >> 用C++ Builderw做Ftp服务器程序

用C++ Builderw做Ftp服务器程序

敬业的IT人 互联网 佚名 2008-1-3 21:39:33

  #include <stdlib.h>    //Required for atoi()
#include "..\winsock.h"  //Winsock header file

#define PROG_NAME    "Quick FTPVersion 1"
#define HOST_NAME    "NIC.DDN.MIL "     // FTP server host
#define PASSWORD     "PASS guest\r\n "  // Password for FTP server host
#define WINSOCK_VERSION   0x0101     // Program requires Winsock version 1.1
#define DEFAULT_PROTOCOL  0          // No protocol specified, use default
#define NO_FLAGS     0               // No special flags specified

char szCommandBuffer[100];     // Buffer for FTP commands
LPSTR lpszFunctionName;        // Pointer for function names

UINT GetReplyCode(LPSTR lpszServerReply)
{
  UINT nCode;                  // Reply code as a number
  char c;                    // Temporary storage
  // lpszFunctionName =  "GetReplyCode ";
  c = *(lpszServerReply+3);           // Save the character
  *(lpszServerReply+3) = '\0';         // Terminate the code

  nCode = atoi((const char *)lpszServerReply); // Convert code to number
  *(lpszServerReply+3) = c;           // Restore the character

  return(nCode);                // Return the reply code
}

UINT ReadFTPServerReply(SOCKET hControlChannel)
{
  char sReceiveBuffer[1024]; // Data-storage buffer for FTP server reply
  int iLength;        // Length of data received from FTP server
   
  lpszFunctionName =  "ReadFTPServerReply ";

    if ((iLength = recv(hControlChannel, (LPSTR)sReceiveBuffer,  
       sizeof(sReceiveBuffer), NO_FLAGS)) == SOCKET_ERROR)
    {
    int iWinsockErr = WSAGetLastError();
    wsprintf(szCommandBuffer,"Error %d from the recv() function!! ",
       iWinsockErr);    
    MessageBeep(MB_ICONHAND);
    MessageBox(NULL, szCommandBuffer, lpszFunctionName,MB_OK |MB_ICONSTOP);
     // Return 999 to indicate an error has occurred
    return(999);
   }  
      
  sReceiveBuffer[iLength] = '\0';
  MessageBeep(MB_ICONASTERISK);
  MessageBox(NULL, (LPSTR)sReceiveBuffer, lpszFunctionName,MB_OK |MB_ICONINFORMATION);
  // Extract the reply code from the server reply and return as an integer  
  return(GetReplyCode(sReceiveBuffer));    
}
  
UINT SendFTPCommand(SOCKET hControlChannel, LPSTR szCommandBuffer)
{
  lpszFunctionName =  "SendFTPCommand ";

  // Send the FTP command
  if ((send(hControlChannel, (LPSTR)szCommandBuffer,  
     lstrlen(szCommandBuffer), NO_FLAGS)) == SOCKET_ERROR)
   {
    int iWinsockErr = WSAGetLastError();
    wsprintf(szCommandBuffer,  "Error %d from the send() function!! ",  
       iWinsockErr);    
    MessageBeep(MB_ICONHAND);
    MessageBox(NULL, szCommandBuffer, lpszFunctionName,MB_OK |MB_ICONSTOP);
     // Return 999 to indicate an error has occurred
    return(999);
   }  
   
  // Read the server's reply and return the reply code as an integer
  return(ReadFTPServerReply(hControlChannel));    
}
  
UINT AnonymousFTPLogIn(SOCKET hControlSocket)
{
  int nReplyCode;         // FTP server reply code
  int iMsg = 0;          // Index subscript for FTP commands
     
  lpszFunctionName =  "AnonymousFTPLogIn ";
  char *LoginCommand[]={"USER anonymous\r\n ",PASSWORD,NULL};
  do
    {
    nReplyCode = SendFTPCommand(hControlSocket,(LPSTR)LoginCommand[iMsg++]);
    }  
  while(LoginCommand[iMsg] && nReplyCode < 400);

  return(nReplyCode);
}

SOCKET ConnectFTPControlSocket(LPSTR lpszHost)
{
  LPHOSTENT lpHostEnt;     // Internet host information structure
  SOCKADDR_IN sockAddr;     // Socket address structure
  LPSERVENT lpServEnt;     // Service information structure
  short nProtocolPort;     // Protocol port
  int nConnect;         // Socket connection results
  SOCKET hControlSocket;    // Control socket handle
   
  lpszFunctionName =  "ConnectFTPControlSocket ";

  if (!(lpHostEnt = gethostbyname(lpszHost)))
   {
    int iWinsockErr = WSAGetLastError();
    wsprintf(szCommandBuffer,"Error #%d while resolving address for %s ",  
       iWinsockErr, lpszHost);
    MessageBeep(MB_ICONHAND);
    MessageBox(NULL, szCommandBuffer, lpszFunctionName,MB_OK |MB_ICONSTOP);
    return(INVALID_SOCKET);
   }
    
  if ((hControlSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP))
     == INVALID_SOCKET)
   {
    int iWinsockErr = WSAGetLastError();
    wsprintf(szCommandBuffer,"Error #%d occurred while creating socket!! ",  
     
粤ICP备06119539号
Copyright CiscoSky.Org,Some Rights Reserved.
Email:me1228#tom.com