在VC6.0中編寫網路應用程式

來源:互聯網
上載者:User
在VC6.0中編寫網路應用程式} 》

{  在網路技術日益發展的今天,如果自己也能夠編寫一個實用的網路應用程式,那麼,不僅能夠激發對網路的興趣,促使自己對網路知識的追求,同時開發過程本身也是一個很好的學習過程。
  在VC6.0中MFC對網路編程有著很好的支援,針對不同用途的網路應用程式,VC有不同的封裝類進行支援,如FTP、HTTP等等,使使用者能夠很快的開發出相應的程式,但同時,也使使用者失去了一些瞭解網路程式啟動並執行底層機制的機會,更重要的是也失去了一定程度上的靈活性。在此我們介紹利用SOCKET通訊端進行開發的一般步驟,供讀者參考。
  在Windows和UNIX下編寫網路應用程式,基本上都是利用SOCKET通訊端進行資料通訊,SOCKET通訊端是從UNIX環境下承襲而來,它在程式中的作用可以理解為網路資料通訊的一個代理,其在Windows中的設計思路與UNIX下相比基本沒有多大變化,分為伺服器通訊端和客戶機通訊端兩個設計部分,設計思路如下:
  第一部分 伺服器端
  一、建立伺服器通訊端(CREATE)。
  二、伺服器通訊端進行資訊綁定(BIND),並開始監聽串連(LISTEN)。
  三、接受來自用戶端的串連請求(ACCEPT),並建立接收進程。
  四、開始資料轉送(SEND、RECEIVE)。
  五、關閉通訊端(CLOSESOCKET)。
  第二部分 客戶機端
  一、建立客戶機通訊端(CREATE)。
  二、與遠程伺服器進行串連(CONNECT),如被接受則建立接收進程。
  三、開始資料轉送(SEND、RECEIVE)。
  四、關閉通訊端(CLOSESOCKET)。
  以上的設計思路是我們開發的基本步驟,同時也是大多數網路應用程式啟動並執行基本方式,下面我們具體說明它在VC中的實現。
  伺服器端:
  一、建立支援SOCKET項目。
  利用APP WIZARD建立MFC EXE項目,進行到WIZARD的第四步時,在“What features would you like include?”中,選中“Windows Sockets”項。其它各步驟各選項根據實際應用進行選擇即可。這樣建立的項目就已經支援SOCKET,並已經初始化了。
  如果要在已有的項目中添加SOCKET支援,只須進行兩項工作:
  1?痹?stdafx.h檔案中包含標頭檔WINSOCK.H (#include “winsock.h” )。
  2?背跏薊?通訊端,在應用程式類的成員函數:“::InitInstance()”中添加如下初始化通訊端代碼。
  if (!AfxSocketInit())
  {AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
  return FALSE;}
  二、建立服務通訊端並建立監聽線程。
  //建立服務通訊端
  SOCKET sercon=socket(PF_INET,SOCK_STREAM,0);
  //判斷是否成功建立
  if (sercon==INVALID_SOCKET)
  {AfxMessageBox(“Server WRONG !”);
  return -1;}
  //配置通訊端地址等資訊
  SOCKADDR_IN sin;
  sin.sin_family=AF_INET;
  //指定本地地址
  sin.sin_addr.s_addr=htonl(INADDR_ANY);
  //指定伺服器連接埠號碼nPort,可自設
  int nPort=5080;
  sin.sin_port=htons(nPort);
  //地址資訊與通訊端進行綁定。
  if (bind(sercon,(LPSOCKADDR)&sin,sizeof(sin))==SOCKET_ERROR)
  {AfxMessageBox(“bind wrong!”);
  return -1;}
  //建立監聽隊列(大小為3),開始監聽
  if (listen(sercon,3)==SOCKET_ERROR)
  {AfxMessageBox(“listen wrong!”);
  return -1;};
  ①實現監聽線程,並建立資料接收線程。
  //在程式需要開始監聽串連的地方建立監聽線程,並實現。
  //建立監聽線程(在程式開始或按鈕事件實現中)
  AfxBeginThread(waitconnect,NULL);
  //實現監聽線程
  UINT waitconnect(LPVOID lpParm)
  {SOCKET conn[3];
  int lenc=sizeof(sockaddr);
  int alreadycon=0;
  //sercon為前面所建立伺服器通訊端
  while(1)
  {if (alreadycon<=3)
  {//接受串連請求
  conn[alreadycon]=accept(sercon,&cin,&lenc);
  if (conn[alreadycon]==INVALID_SOCKET)
  {AfxMessageBox(“accept WRONG !”);}
  else
  {//建立資料接收線程
  AfxBeginThread(readdata,&connn[alreadycon]);
  Alreadycon= alreadycon+1;
  return 0;}}
  else
  {//避免影響主線程運行
  Sleep(200);}
  }
  }
  ②實現資料接收線程。
  UINT waitconnect(LPVOID ss)
  { SOCKET *readsock;
  readsock=(SOCKET *)ss;
  char buf[2000];
  int revnum=0;
  //開始迴圈接受資料
  while (revnum!=-1)
  {//revnum<=0則表示串連已斷!
  revnum=recv(*readsock,buf,2000,0);
  if (revnum>0)
  buf[revnum]=0;//截斷緩衝區
  //buf中儲存已接受資料。}
  }
  ③發送資料
  //conn[1]為用於接受串連的通訊端, sendstr為所發送資料。
  send(conn[1],LPCTSTR(sendstr),sendstr.GetLength(),0);
  ④關閉通訊端。
  //conn[1]為用於接受串連的通訊端
  closesocket(conn[1]);
  客戶程式端:
  用戶端程式的編程有很多與伺服器端相同或相近,甚至相同的代碼。
  一、建立支援SOCKET項目。
  方法同伺服器端。
  二、建立客戶通訊端、對伺服器進行串連。
  //nHost 須使用者指定的遠程服務機,IP或網域名稱。
  CString nHost;
  //h為地址資訊
  struct hostent *h;
  h=gethostbyname(nHost);
  //nHost 須使用者指定的遠程服務連接埠號碼
  int nPort;
  SOCKET con_client;
  SOCKADDR_IN csin;
  if (h!=NULL)
  {//建立通訊端
  con_client =socket(AF_INET,SOCK_STREAM,0);
  csin.sin_family=AF_INET;
  memcpy(&(csin.sin_addr.s_addr),h->h_addr,sizeof(int));
  csin.sin_port=htons(nPort);
  //開始串連
  if (connect(con_client,(LPSOCKADDR)&csin,sizeof(csin)))
  {//AfxMessageBox(“connect wrong!”);
  return -1;}
  else
  {//串連成功,建立資料接收線程
  AfxBeginThread(readdata,&con_client);}
  }
  三、實現資料接收線程。
  代碼與伺服器端完全相同。
  四、發送資料。
  //con_client 為與伺服器進行串連的通訊端。
  send(con_client,LPCTSTR(sendstr),sendstr.GetLength(),0);
  五、關閉通訊端。
  // con_client 為與伺服器進行串連的通訊端。
  closesocket(conn[1]);
  在實際應用中,應當根據需要調整並改變一些變數的範圍。
  以上程式在VC6.0 、WIN NT4.0 及Windows 98中調試通過。
  最後說一點,在VC6.0 MFC中的CSOCKET類是對SOCKET的一個MFC封裝,並且它支援文檔序列化,可以方便地實現不同資料類型的傳輸。本文前面之所以沒有介紹CSOCKET,是因為用CSOCKET的實現方法與上面所講述的思路相同,並且更為簡單。另外一個更重要的原因是便於向UNIX編程時移植,因為UNIX支援SOCKET。}
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.