1. 程式人生 > >Visual C++網路程式設計經典案例詳解 第4章 FTP瀏覽器 登入FTP伺服器 連線FTP伺服器

Visual C++網路程式設計經典案例詳解 第4章 FTP瀏覽器 登入FTP伺服器 連線FTP伺服器

在對FTP檔案進行相關處理之前 必須在成功連線 登入伺服器以後 才可以執行相關的操作

因為FTP連線是基於Windows套接字程式設計的 所以FTP的連線過程和Socket連線一樣 也就是客戶端建立連線套接字以後 呼叫函式Connect()向伺服器連線請求

使用者需要特別注意的是待伺服器同意連線並返回後, 客戶端必須先發送一個空字串到伺服器進行初始化 這樣才能進行資料的交換

1 例項化CSocket CSocket類是MFC對Windows套接字的一個封裝類 一般 它使用類的建構函式來例項化物件 但是在實際程式設計中 建構函式常使用關鍵字new呼叫 構造一個沒有初始化的套接字物件

CSocket m_clientsocket=new CSocket 
//構造一個套接字物件m_clientsocket

構造該物件後  必須呼叫成員函式Create 建立完整的套接字控制代碼

BOOL CSocket::Create(UINT nSocketPort,
int nSocketType=SOCK_STREAM,LPCTSTR lpszSocketAddress=NULL);

引數nSocketPort用來指定與套接字相關聯的本地埠號 預設值為0 設定FTP埠21 nSocketType指定套接字型別 SOCK+STREAM 預設為表示建立流式套接字

FTP客戶端均採用預設型別 lpszSocketAddress指定建立套接字的網路地址 預設為NULL 客戶端一般設定為NULL 該函式呼叫成功返回非零值,否則返回0,表示出錯。

2 實現連線功能 使用者建立套接字物件以後,就可以呼叫函式去實現真正的連線了。 實現連線功能的函式是Connect()

BOOL Connect(LPCSTR lpszHostAddress,UINT nHostPort)

lpszHostAddress指定要連線的伺服器地址 nHostPort指定將要連線伺服器上的埠號 一般程式設計中將此引數設定為21號埠 該函式連線伺服器成功 則返回true 否則返回false

CSocket *m_clientsocket=new CSocket()
//構造連線套接字物件
m_clientsocket->Create(21,SOCKE_STREAM,FD_READ|FD_WRITE,NULL);
//建立流式套接字
m_clientsocket->Connect("218.6.132.5",21);

這段程式碼的作用是建立套接字物件後 呼叫函式Connect進行連線伺服器操作

3 封裝連線過程 FTP的連線過程主要有自定義函式FTPConnect()實現 根據使用者輸入的伺服器地址和埠號 連線FTP伺服器 即返回值表示操作是否成功

//連線伺服器函式,引數severhost 表示伺服器的ip地址 port指定要連線的伺服器埠。
BOOL FTPConnect(CString serverhost,int port)
{
  CSocket *m_clientsocket=new CSocket();//構造連線套接字物件  
  m_clientsocket->Create(21,SOCKE_STREAM, FD_READ|FD_WRITE,NULL);
  if(!m_clientsocket)//判斷套接字物件是否建立成功
  {
      MessageBox("套接字建立失敗!");
      return false;
  }
  if(!(m_clientsocket->Connect(serverhost,port)))return false;
  //連線FTP伺服器
  else {return true;}//連線成功將返回true
}

在函式中 引數serverhost和port分別指定要連線的伺服器的地址和埠 程式首先建立流式套接字m_clientsocket 呼叫CSocket類的函式Connect()連線FTP伺服器 當連線失敗時 函式返回false 否則返回true

自定義函式FTPConnect()封裝完成後便可以對其進行呼叫

Void Onconnect()
{
  CString address="218.6.132.5"    ;//對應ip地址字串變數並初始化
  int port = 21; //定義埠變數並初始化
  if(!(FTPConnect((LPCSTR)address,port)))//判斷FTPConnect呼叫是否成功
  {
      MessageBox("連線失敗!"); //提示失敗
  }
  else
  {
      MessageBox("連線伺服器成功!"); //否則提示成功
  }
}

函式OnConnect()根據定義的ip地址和埠號 呼叫自定義函式連線伺服器 IP地址和埠號可以由使用者進行自定義