《電子技術應用》
您所在的位置:首頁 > 通信與網絡 > 業界動態 > 基于TCP/IP的多線程通信及其在遠程監控系統中的應用

基于TCP/IP的多線程通信及其在遠程監控系統中的應用

2009-05-19
作者:王金廉 謝劍英 賈 青

  摘 要: 提出了一種在Windows NT下基于TCP/IP協議的多線程通信的設計與實現方法,在此基礎上給出了多線程通信在蓄電池遠程監控系統中的應用實例。
  關鍵詞: 多線程 實時性 TCP/IP協議 遠程監控系統


  傳統的應用程序都是單線程的,即在程序運行期間,由單個線程獨占CPU的控制權,負責執行所有任務。在這種情況下,程序在執行一些比較費時的任務時,就無法及時響應用戶的操作,影響了應用程序的實時性能。在監控系統,特別是遠程監控系統中,應用程序往往不但要及時把監控對象的最新信息反饋給監視客戶(通過圖形顯示),還要處理本地機與遠程機之間的通信以及對控制對象的實時控制等任務,這時 ,僅僅由單個線程來完成所有任務,顯然無法滿足監控系統的實時性要求。在DOS系統下,這些工作可以由中斷來完成。而在Windows NT下,中斷機制對用戶是不透明的。為此,可引進多線程機制,主線程專門負責消息的響應,使程序能夠響應命令和其他事件。輔助線程可以用于完成其他比較費時的工作,如通信、圖形顯示和后臺打印等,這樣就不至于影響主線程的運行。
1 Windows NT 多線程概述
  Windows NT是一個真正的搶占式多任務操作系統。在Windows NT中,啟動一個應用程序就是啟動該應用程序的一個實例,即進程。進程由一個或多個線程構成,擁有內存和資源,但自己不能執行自己,而是進程中的線程被調度執行。進程至少要有一個線程,當創建一個進程時,就創建了一個線程,即主線程。主線程可以創建其他輔助線程,由主線程創建的線程又可創建線程。每個線程都可指定優先級,操作系統根據線程的優先級調度線程的執行。
  Windows NT中使用多線程的方法有三種:
  · 使用C多線程庫函數;
  · 使用CreateThread() 等Win32函數;
  · 使用MFC類。
  本文采用第三種方法。在Visual C++5.0 中,MFC應用程序用CWinThread 對象表示線程?;静僮魅缦拢?BR>  · 創建新線程:調用MFC全局函數AfxBeginThread( )創建新線程。AfxBeginThread( )啟動新線程并返回控制,然后,新線程和調用AfxBeginThread( )的線程同時運行。它的返回值為指向CWinThread對象的指針;
  · 暫停/恢復線程:調用CWinThread類成員函數SuspendThread( )暫停線程的運行,調用ResumeThread( )成員函數恢復線程的運行;
  · 終止線程:在線程內部可調用全局函數AfxEndThread( )終止線程的運行,否則,線程執行結束后,線程自動從線程函數返回并釋放線程占有的資源。
2 基于TCP/IP 的多線程編程
  TCP/IP是Internet上廣泛使用的一種協議,可用于異種機之間的互聯。TCP/IP協議本身是非常復雜的,然而在網絡編程中,程序員不必考慮TCP/IP的實現細節,只需利用協議的網絡編程接口Socket(亦稱套接字)即可。在Windows中,網絡編程接口是Windows Sockets,它包含標準的Berkley Sockets的功能調用的集合,以及為Windows 所做的一些擴展。TCP/IP協議的應用一般采用客戶/服務器模式,面向連接的應用調用如圖1所示。


  根據上述順序調用函數建立連接后,通信雙方便可交換數據[1]。然而,在調用帶*號的函數時,操作常會阻塞,特別是當套接字工作在同步阻塞模式(Blocking Mode)時。這時,程序無法響應任何消息。為了避免出現這種情況,本文引進輔助線程。在執行含有可能阻塞的函數的任務時,動態創建新的線程,專門處理該任務。主線程把任務交給輔助線程后,不再對輔助線程加以控制與調度。本文分別針對connect()、accept()、receive()、send()等可能阻塞的函數創建了相應的線程,如表1所示。


  多線程編程常常還要考慮線程間的通信。線程間的通信可以采用全局變量、指針參數和文件映射等方式。本文采用指針參數方式。在調用AfxBeginThread()函數時,通過傳遞指針參數的方式在主線程與輔助線程間通信。
  AfxBeiginThread( )函數的用法如下:
  CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc,
  LPVOID pParam,
  int nPriority=THREAD_PRIORITY_NORMAL,
  UINT nStackSize=0,
  DWORD dwCreateFlags=0,
  LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL );
  參數pfnThreadProc指定線程函數,必須如下定義:
  UINT MyControllingFunction( LPVOID pParam );
  參數pParam 是調用線程傳遞給線程函數pfnThreadProc的參數;
  其他參數一般只需采用缺省值。
  指針參數通信方式就是通過參數pParam在線程間通信的,它可為指向任何數據類型的指針。本文中,定義了一個名叫EXCHANGE_INFO的結構如下:
  typedef struct
  {  SOCKET sServerSocket;
    SOCKET *psClientSocket;
    SOCKADDR_IN *pClientAddr;
    BOOL *pbConnected;
    unsigned char *pucBuffer;
    int *pnMessageLen;
  } EXCHANGE_INFO;
  在需要通信時,先聲明一個結構變量,再把變量的指針作為pParam參數,調用AfxBeginThread((AFX_THREADPROC) CSocketThread::WaitForConnectThread, (LPVOID)& m_ExchangeInfo)函數即可。
  為了利用面向對象技術編程所具有的模塊性強、便于修改、可移植性好等優點,本文還把表1中的線程封裝為父類為CWinThread的自定義類CSocketThread中。還自定義了一個叫CSocketComm的新類,封裝了一些函數,如CreateSocket、ConnectToServer、WaitForClient、ReadMessage、SendMessage等,這些函數屏蔽了面向連接的通信程序的實現細節,如創建、連接、發送和接收等,在這些函數里,動態創建輔助線程。
  下面以CSocketComm類中的等待客戶連接請求的函數WaitForClient()為例,注釋說明多線程編程的具體細節。
  BOOL CSocketComm::WaitForClient()
  {
  if( m_bConnected ) return( TRUE );
  //配置bind函數的參數,即服務器的套接字地址結構
  SOCKADDR_IN Addr;
  memset( &Addr, 0, sizeof( SOCKADDR_IN ) );
  Addr.sin_family = AF_INET;
  Addr.sin_port = htons( m_nPort );
  Addr.sin_addr.s_addr = htonl( INADDR_ANY );
  //將套接字地址結構賦予套接字(綁定),以指定本地半相關
  int nReturnValue;
  nReturnValue = ::bind( m_sServerSocket, (LPSOCKADDR) &Addr,sizeof( SOCKADDR_IN ) );
  if( nReturnValue == SOCKET_ERROR ) return( FALSE );
   //配置傳給WaitForConnectThread線程函數的參數m_ExchangeInfo
  m_ExchangeInfo.sServerSocket = m_sServerSocket;
  m_ExchangeInfo.psClientSocket = &m_sClientSocket;
  m_ExchangeInfo.pClientAddr = &m_ClientAddr;
  m_ExchangeInfo.pbConnected = &m_bConnected;
  //以m_ExchangeInfo的指針為參數調用WaitforConnectThread線程等待客戶端連接
  AfxBeginThread((AFX_THREADPROC)CSocketThread::
  WaitForConnectThread, (LPVOID) & m_ExchangeInfo );
  return( TRUE );
  }
  //等待連接線程
  UINT CSocketThread::WaitForConnectThread(LPVOIDpParam)
  {
  EXCHANGE_INFO*pExchangeInfo=(EXCHANGE_INFO *) pParam;
  int nReturnValue, nClientAddrSize = sizeof( SOCKADDR_IN );
  //偵聽連接
  nReturnValue = ::listen(pExchangeInfo ->sServerSocket, 1 );
  if( nReturnValue == SOCKET_ERROR ) return( 0 );
  //阻塞調用accept,直至有客戶連接請求
  *pExchangeInfo->psClientSocket = ::accept(pExchangeInfo->sServerSocket, (LPSOCKADDR) pExchangeInfo ->pClientAddr, &nClientAddrSize );
  if( (*pExchangeInfo ->psClientSocket) != INVALID_SOCKET )
  //通過pExchangeInfo的指針在線程間通信
  *pExchangeInfo->pbConnected = TRUE;
  return( 0 );
  }
3 應用實例-高層協議的設計
  在電廠和電站中,為了保證安全工作,保護系統必不可少。保護系統的電源供應通常使用兩種方式。一般情況下,使用交流電系統對保護系統進行供電;當交流電系統出現故障時,立即使用后備的蓄電池系統對保護系統進行供電。為了對蓄電池系統進行監控和管理,以保證蓄電池在關鍵時刻能正常工作,設計了在Windows NT環境下具有遠程通訊功能和動態人機界面的智能蓄電池遠程監控系統 。該系統由蓄電池智能管理、充電機控制、母線絕緣在線檢測、聲光報警、系統組態、遠程通信等子系統組成,實現對蓄電池/充電機智能化遠程管理和控制,對整個系統的運行狀態進行實時監控,具有多媒體報警、事件處理、動態數據庫、趨勢畫面和動態畫面顯示、操作提前提醒等功能。系統框圖如圖2所示。在遠程通信模塊中,遠程監控機需把監控客戶的操作命令及時傳給本地機,本地機根據命令控制充電機,使之按照一定的方式工作,而本地機需定時向遠程監控機反饋實時的充電機狀態信息。它們之間的通信是基于TCP/IP的廣域網通信,而且,我們引進了多線程機制以保證系統具有良好的實時性。


  下面以其中的充電機控制系統為例談談如何使用CSocketComm類進行遠程通信。為簡單起見,假定本地機與遠程監控機之間通信的信息僅有下面三種類型:
  ·本地機接收到該命令后,控制充電機按照穩壓模式運行,輸出電壓為電壓給定值;
  ·本地機接收到該命令后,控制充電機按照穩流定時模式運行,輸出電流為電流給定值;
  ·本地機向遠程監控機發送充電機的實時狀態數據(包括輸出電壓、輸出電流、狀態指示和故障類型指示)。
  在基于TCP/IP的面向連接的網絡通信中,客戶與服務器之間傳送的是有序可靠的字節流(Byte Stream),所以程序員有必要在傳輸層TCP上定義自己的高層協議,設計幀結構,將字節流變成有意義的信息。在CSocketComm類中由AssembleMessage( )函數把數據組合成一定的幀結構。幀結構為:

  
  其中@為幀起始標志,#為幀終結標志
  對應的結構定義如下:
  typedef struct
  { int MessageType; //信息類型
  int ChargerNo; //充電機編號
  int DataNo; //數據類型
  float Data; //數據
  } MessageStruct;
  需要通信時,先聲明一個MessageStruct變量,根據信息內容對各成員變量賦值,傳給 AssembleMessage()函數組合成幀,再調用SendMessage()函數發送給接受方。接受方接到數據后,對數據內容的解釋,是由CSocketComm類中的AnalyzeMessage()函數完成的。AnalyzeMessage()函數返回一個MessageStruct變量。應用程序就可根據它的各成員變量控制充電機或動態顯示充電機的狀態。
  總之,把多線程機制引進通信,有利于提高應用程序的實時性,充分利用系統資源。對于大型的工程應用來說,不同的線程完成不同的任務,也有利于提高程序的模塊化,便于維護和擴展。本文給出了一種在Windows NT下基于TCP/IP協議的多線程通信的基本方法,根據該方法進行修改和擴充,便可設計出符合具體應用的高質量的多線程通信程序。
參考文獻
1 蔣東興,林鄂華.Windows Socket 網絡程序設計指南.北京:清華大學出版社,1995
2 Rajagopal Raj, Monica Subodh P.Windows NT4高級程序設計.北京:機械工業出版社,1998

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          久久久综合免费视频| 一本一本久久| 欧美色欧美亚洲另类二区| 日韩视频在线观看国产| 亚洲第一精品夜夜躁人人爽| 亚洲视频在线一区| 黄色精品网站| 国产日韩在线视频| 国产亚洲欧美一区二区| 久久精品99国产精品酒店日本| 亚洲视频一二三| 久久精品国产精品亚洲精品| 免费欧美高清视频| 国产精品美腿一区在线看| 久久九九久久九九| 久久精品99| 国产亚洲激情在线| 日韩视频精品在线| 久久综合五月天婷婷伊人| 欧美mv日韩mv国产网站| 亚洲视频 欧洲视频| 一区二区三区国产盗摄| 亚洲国产精品第一区二区三区| 亚洲视频综合在线| 黄色国产精品| 欧美aaa级| 亚洲欧洲免费视频| 国产视频丨精品|在线观看| 亚洲私人黄色宅男| 午夜欧美理论片| 久久精品国产久精国产爱| 欧美日韩亚洲一区二区三区| 91久久精品一区二区三区| 另类人畜视频在线| 欧美国产精品专区| 久久精品国产欧美亚洲人人爽| 国产三级精品在线不卡| 亚洲老司机av| 午夜精品久久久久久久久久久久| 久久九九久精品国产免费直播| 国产欧美一区二区精品性| 麻豆精品视频在线观看| 久久er99精品| 激情亚洲网站| 久久久久**毛片大全| 亚洲精品久久久久中文字幕欢迎你| 欧美电影在线免费观看网站| 亚洲在线网站| 欧美日韩国产成人在线免费| 亚洲精品久久| 亚洲欧美日本另类| 亚洲精选中文字幕| 欧美天堂在线观看| 欧美日韩免费在线视频| 亚洲精品视频一区二区三区| 欧美一级理论片| 99精品国产高清一区二区| 国产日本欧美在线观看| 亚洲一区成人| 亚洲国产婷婷| 久久久精品欧美丰满| 国产一区二区三区最好精华液| 久久精品99国产精品| 久久久久这里只有精品| 在线观看日韩国产| 99re成人精品视频| 99在线热播精品免费99热| 中文国产亚洲喷潮| 欧美国产日韩在线观看| 老司机午夜精品视频在线观看| 久久精品99国产精品酒店日本| 欧美激情免费观看| 欧美日韩视频在线第一区| 国产精品美女一区二区| 久久riav二区三区| 国产中文一区二区| 午夜亚洲激情| 国产精品一区二区久久| 亚洲综合好骚| 在线日本成人| 亚洲毛片在线看| 欧美日韩久久| 欧美日韩一区二区三| 久久久国产精品亚洲一区| 亚洲欧美综合一区| 亚洲尤物精选| 欧美日韩国产经典色站一区二区三区| 久久天天躁狠狠躁夜夜av| 国产精品久久77777| 免费成人黄色片| 亚洲国产精品视频一区| 久久综合成人精品亚洲另类欧美| 亚洲电影在线免费观看| 国产小视频国产精品| 一区二区三区在线观看欧美| 国产欧美日韩亚州综合| 国产精品一香蕉国产线看观看| 亚洲午夜精品久久久久久app| 欧美午夜无遮挡| 国产一区二区精品久久| 亚洲裸体俱乐部裸体舞表演av| 亚洲一区在线视频| 亚洲激情成人在线| 性xx色xx综合久久久xx| 久久漫画官网| 国产女人精品视频| 99亚洲一区二区| 今天的高清视频免费播放成人| 韩日视频一区| 日韩亚洲成人av在线| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美mv日韩mv国产网站| 亚洲国产aⅴ天堂久久| 在线视频欧美精品| 久久亚洲欧美国产精品乐播| 国产精品av久久久久久麻豆网| 欧美一区二区三区免费大片| 亚洲欧美日韩国产一区| 国内精品伊人久久久久av一坑| 欧美电影美腿模特1979在线看| 在线视频亚洲一区| 亚洲一区二区三区在线观看视频| 国产精品国产| 国产午夜精品美女毛片视频| 久久中文字幕一区二区三区| 国产精品久久久久免费a∨大胸| 一区二区三区四区蜜桃| 久久蜜桃精品| 在线播放一区| 精品999日本| 欧美日韩国产一区精品一区| 美女精品在线观看| 亚洲日本va午夜在线电影| 伊人久久婷婷| 欧美日韩亚洲一区三区| 中国日韩欧美久久久久久久久| 久久久亚洲午夜电影| 亚洲免费观看高清完整版在线观看| 亚洲欧美一区二区激情| 亚洲国产另类久久久精品极度| 亚洲欧美区自拍先锋| 国内成+人亚洲+欧美+综合在线| 欧美成在线视频| 欧美啪啪一区| 国产精品男人爽免费视频1| 亚洲人成亚洲人成在线观看| 欧美日韩三级一区二区| 精品不卡视频| 国产欧美视频一区二区| 欧美日本在线观看| 午夜精品婷婷| 亚洲久久一区二区| 99精品国产在热久久下载| 国产精品a级| 欧美日韩亚洲综合| 亚洲精品男同| 国产欧美日韩精品丝袜高跟鞋| 久久精品噜噜噜成人av农村| 欧美日韩国产色视频| 久久综合九色综合久99| 久久噜噜亚洲综合| 欧美国产日韩精品免费观看| 狠狠色综合网站久久久久久久| 亚洲精品久久久一区二区三区| 欧美日本一道本在线视频| 欧美三级小说| 一本色道久久综合狠狠躁篇的优点| 午夜精品久久久久久久久| 久久久精品国产免费观看同学| 91久久中文| 国产精品福利av| 久久综合伊人77777尤物| 亚洲激情图片小说视频| 欧美激情一区二区三区不卡| 亚洲午夜视频在线| 亚洲影院色无极综合| 久久亚裔精品欧美| 亚洲乱码日产精品bd| 欧美韩国在线| 久久视频在线视频| 99这里只有久久精品视频| 欧美亚洲第一页| 欧美在线一区二区| 一色屋精品视频在线观看网站| 国产亚洲欧美在线| 亚洲欧美日韩一区在线观看| 欧美日韩天堂| 欧美在线一二三四区| 久久久之久亚州精品露出| 久久久久久久波多野高潮日日| 欧美激情精品久久久久| 国产精品蜜臀在线观看| 国产亚洲aⅴaaaaaa毛片| 亚洲日本乱码在线观看| 国产午夜精品全部视频播放| 欧美视频一区二区在线观看| 激情亚洲一区二区三区四区| 国产精品99久久久久久久vr| 亚洲欧洲精品一区二区| 国产精品高潮呻吟| 国产精品成人aaaaa网站| 欧美一区二区三区播放老司机| 国产精品电影在线观看| 亚洲福利在线观看| 国产精品色午夜在线观看| 一本一道久久综合狠狠老精东影业| 久久午夜精品一区二区| 亚洲欧洲日韩综合二区| 亚洲福利视频在线| 亚洲一二三区在线观看| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲一区二区三区在线视频| 欧美一区二视频| 国产精品网红福利| 欧美日韩高清不卡| 国产亚洲一区在线播放| 欧美视频在线看| 欧美在线观看视频一区二区三区| 欧美视频四区| 国产欧美日韩精品丝袜高跟鞋| 国产精品永久免费视频| 国产日韩欧美在线视频观看| 蜜桃久久精品乱码一区二区| 久久激情久久| 亚洲作爱视频| 欧美日本免费| 美女啪啪无遮挡免费久久网站| 国产美女精品视频免费观看| 国产精品美女久久| 久久精品国产一区二区电影| 亚洲美女电影在线| 亚洲成色777777在线观看影院| 国产午夜精品在线观看| 欧美精品日韩一本| 欧美日韩在线播放三区四区| 国产精品二区二区三区| 在线日韩一区二区| 亚洲免费电影在线观看| 欧美色视频在线| 老司机午夜精品视频在线观看| 亚洲香蕉伊综合在人在线视看| 亚洲国产成人久久综合| 亚洲欧洲日产国产网站| 日韩午夜在线观看视频| 亚洲精选一区| 亚洲成色999久久网站| 欧美日韩一区二| 欧美伦理在线观看| 欧美一二三区精品| 夜夜嗨av一区二区三区网站四季av| 久久日韩精品| 亚洲国产精品综合| 久久精品官网| 欧美日韩在线大尺度| 亚洲欧洲一区二区三区| 欧美激情网站在线观看| 国产精品自拍视频| 在线观看亚洲视频| 亚洲午夜三级在线| 欧美日韩中文在线| 久久久综合香蕉尹人综合网| 久久精品二区亚洲w码| 亚洲永久免费精品| 国产精品视频观看| 欧美日本中文字幕| 99精品欧美一区二区三区综合在线| 在线精品在线| 欧美一区三区三区高中清蜜桃| 一本大道久久a久久精二百| 欧美日韩三级电影在线| 国产日韩精品一区二区三区在线| 亚洲主播在线播放| 麻豆成人在线播放| 久久国产精品一区二区三区| 好看的av在线不卡观看| 欧美系列电影免费观看| 欧美视频1区| 欧美日韩一级视频| 国产一区二区三区久久久| 精品51国产黑色丝袜高跟鞋| 亚洲欧美一区二区三区极速播放| 国内精品视频在线观看| 欧美大片第1页| 伊人久久婷婷色综合98网| 好男人免费精品视频| 欧美一区午夜精品| 国产精品久久久久久久久久免费| 红桃视频亚洲| 一本一道久久综合狠狠老精东影业| 国产日韩专区在线| 欧美在线视频免费播放| 亚洲大片一区二区三区| 欧美极品在线观看| 国产精品中文在线| 欧美一区国产二区| 国外成人网址| 国产一区二区三区直播精品电影| 久久免费黄色| 欧美福利视频网站| 国内精品视频一区| 欧美另类高清视频在线| 久久成人羞羞网站| 亚洲精品久久嫩草网站秘色| 亚洲高清视频在线观看| 欧美日韩一区二区在线观看| 欧美性一区二区| 欧美图区在线视频| 一区二区久久| 亚洲免费观看高清完整版在线观看熊| 国产一区二区电影在线观看| 国产女人水真多18毛片18精品视频| 欧美视频国产精品| 欧美午夜精品电影| av72成人在线| 亚洲精品乱码久久久久久黑人| 久久国产直播| 国产精品欧美风情| 国语自产在线不卡| 久久国产精品久久久久久电车| 黄色一区二区三区四区| 激情亚洲一区二区三区四区| 午夜久久久久久久久久一区二区| 欧美日韩一区二区三区视频| 亚洲乱码国产乱码精品精98午夜| 亚洲欧美激情视频在线观看一区二区三区| 亚洲五月婷婷| 久久久综合激的五月天| 国产一区二区观看|