撥號上網程式 (轉)

worldblog發表於2007-12-05
撥號上網程式 (轉)[@more@]

關鍵詞:Visual C++

大家知道,ants、 Expert等中都帶有定時撥號上網軟體的功能。而
一般的撥號上網,利用的是的Remote Access Service(RAS,訪問服務)。
下面介紹一下其在Visual C++下的實現。
  Visual C++為我們提供了包含RAS 宣告的“ras.h″頭。要在中實現撥號
上網功能,其大致過程如下:
  1. 利用Modem撥號進行連線,應使用RasDial。
  其宣告如下:
  D Ras Dial(LPRASDIALEXTENSIONS lpRas DialExtensions,LPCTSTR lpszPhoneboo
k,LPRASDIALPARAMS lp Ras DialParams,DWORD dw Notifier Type,LPVOID lpv Notifier,
  LPHRANN lph Ras Conn )
  引數說明:
  lpRasDialExtensions和lpszPhonebook:僅在下有效,在Windows 95下,這
兩個引數被忽略。
  lpRasDialParams:這個引數很重要,它指向一個RASDIALPARAMS結構,該結構包含以下
幾個成員:
  dwSize:應設定為sizeof(RASDIALPARAMS);
  szEntryName和szPhoneNumber:這兩個引數有聯絡,szEntryName可以指定要建立的連線
,比方說“我的連線”等等,這是處理使用者已經在“撥號”裡建立的連線的。這時,Mo
dem將撥打你在“我的連線”中設定的ISP號碼,此時szPhoneNumber成員設為空字串“”即
可;如果你要在程式中自行指定要撥打的ISP號碼的話,szEntryName可以設定為空字串“
”,此時應設定szPhoneNumber為你的ISP號碼(169,663等),特別的,對於用201電話卡來
上網的情況,可以設為“201,,,賬號,密碼#,,ISP號碼#”(其中“,”表示停頓一段時
間(以等待確認賬號,密碼等),你可以根據自己所在位置的線路狀況自行調節。
  SzCallBackNumber,szain:設為空串“”即可。
  SzUserName,szPassword:登入使用者名稱和密碼。如169公用賬號guest,guest。
  其他成員不必設定。
  DwNotifierType:指定是由視窗還是由回撥函式來處理確認訊息。透過確認訊息我們可
以得到RasDial過程的當前狀態。如“正在開啟段口”,“正在驗證使用者名稱和密碼”等。也可
設為NULL。
  dwNotifier:指定處理確認訊息的視窗或回撥函式。也可設為NULL。
  LphRasConn:指向一個型別為HRASCONN的變數。在RasDial前必須指定為NULL,Ras
Dial若成功返回,則將RAS連線的控制程式碼存放於它所指向的變數中。我們也可以透過此控制程式碼來斷
開連線。
  只要在程式中適當位置呼叫RasDial函式即可建立連線。
  2. 理確認訊息以得到撥號過程的當前狀態。
  我們以指定視窗來處理確認訊息為例說明如何得到撥號過程的當前狀態。
  在處理確認訊息的對話方塊類(或檢視類等)的實現程式碼中加入:
  const UINT WM_RASEVENT = ::RegisterWindowMessageA(RASDIALEVENT);
  在Message Map中手工加入訊息對映:(****是你定義的對話方塊類名稱)
  BEGIN_MESSAGE_MAP(****, CDialog)
  //AFX_MSG_MAP(****)
  ……
  ON_REGISTERED_MESSAGE(WM_RASEVENT, OnRasDialEvent)(  //AFX_MSG_MAP
  END_MESSAGE_MAP()
  加入成員函式處理訊息:
  LRESULT CDialInfo::OnRasDialEvent(WPARAM wp, LPARAM lp)
  {
  RASCONNSTATE rasstate= (RASCONNSTATE)wp;
  CListBox *info =(CListBox *)GetDlgItem(IDC_INFOLIST);
  //用ListBox (ID為IDC-INFOLIST)來顯示狀態)
  switch(rasstate)
  {
  case RASCS_OpenPort:
  info→AddString(_T(″開啟埠……″));
  break;
  case RASCS_PortOpened:
  info→AddString(_T(″埠已開啟.″));
  break;
  case RASCS_ConnectDevice:
  info→AddString(_T(″連線裝置……″));
  break;
  case RASCS_DeviceConnected:
  info→AddString(_T(″裝置已連線.″));
  break;
  case RASCS_Authenticate:
  info→AddString(_T(″驗證使用者及密碼″));
  break;
  case RASCS_Authenticated:
  info→AddString(_T(″透過″));
  break;
  case RASCS_Connected:
  info->AddString(_T(″已連線″));
  reak;
  case RASCS_Disconnected:
  info->AddString(_T(″連線已斷開″));
  m_hRasConn=NULL;
  //可定義型別為HRASCONN的成員變數m_hRasConn來儲存RAS連線的控制程式碼。
  //在呼叫RasDial時用指向m_hRasConn的指標作為lphRasConn引數。
  //既然用m_hRasConn來儲存連線控制程式碼,連線斷開後應重置為NULL.
  break;
  default:
  return (LRESULT)0;
  }
  return (LRESULT)0;
  }
  3. 斷開連線:
  if (m_hRasConn != NULL)
  {
  RasHangUp(m_hRasConn);
  m_hRasConn = NULL;
  m_OnDial=TRUE;
  :Sleep(2000);
  }
  注意 :
  你也許注意到了以上程式碼中的Sleep函式,這裡是必需的。需要一定時間來斷開連線。如
果不等待一段時間,有可能無法正常關閉埠。導致下一次無法撥號,只有重新啟動
Windows才能解決。要預防此問題也可以呼叫RasGetConnectStatus函式,方法如下:
  RASCONNSTATUS rStatus;
  while(RasGetConnectStatus(m_hRasConn,&rStatus)!=ERROR_INVALID_HANDLE)

  {
  ::Sleep(0);
  }
  4.在以下情況下:
  ① 瀏覽網頁時有時會出現停止響應,重啟explorer後工作列上的連線狀態圖示也許會消
失。
  ② 希望在連線成功後,退出程式,再次此程式可選擇斷開連線。
  可以呼叫RasEnumConnection函式來得到當前連線的控制程式碼。
  舉例如下:
  HRASCONN hRasConnect;DWORD dwBuffferSize, dwNumofConnections;//緩衝區大小,連
接數
  LPRASCONN lpRasConn;
  lpRasConn = new RASCONN[3】;//最多可得到3個連線控制程式碼,客戶端程式其實不必設為
3,因連線數有限,大部分僅一個連線。
  lpRasConn[0】.dwSize = sizeof(RASCONN);
  dwBuffferSize = 32* sizeof(RASCONN);//求出由3個RASCONN結構構成的緩衝區大小
  RasEnumConnections(lpRas Conn, &dw Buffer Size, &dw Numof Connections);//
此函式若成功則返回零。
  for(DWORD i=0; i   {
  hRasConnect = lpRasConn[i】.hrasconn;//RASCONN結構的hrasconn成員為RAS連線句

   RasHangUp(hRasConnect);
   ::Sleep(2000);
  }
  delete [】 lpRasConn;
  在,Visual C++ 6.0下透過。
  這樣,一個實現基本撥號上網功能的程式就完成了。如果你要了解更多有關情況或服務
器端,可以參考MSDN→PlatfoSDK→Networking and Distributed Services→R
emote Access Service的有關內容


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988588/,如需轉載,請註明出處,否則將追究法律責任。

相關文章