日韩床上生活一级视频|能看毛片的操逼网站|色悠悠网站在线观看视频|国产免费观看A淫色免费|国产av久久久久久久|免费A级视频美女网站黄|国产毛片av日韩小黄片|热久久免费国产视频|中文字幕无码色色|成人在线视频99久久久

機(jī)電之家資源網(wǎng)
單片機(jī)首頁(yè)|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
基于TCP/IP的多線程通信及其在遠(yuǎn)程監(jiān)控系統(tǒng)中的應(yīng)用
基于TCP/IP的多線程通信及其在遠(yuǎn)程監(jiān)控系統(tǒng)中的應(yīng)用
 更新時(shí)間:2008-8-16 21:02:29  點(diǎn)擊數(shù):20
【字體: 字體顏色
下:

      CWinThread*AfxBeginThread (AFX_THREADPROC pfnThreadproc,

      LPVOID pParam,

      int nPriority=THREAD_PRIORITY_NORMAL,

      UINT nStackSixe=0,

      DWORD dwCreateFlags=0,

      LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);

       參數(shù)pfnThreadProc指定線程函數(shù)必須如下定義:

      UINT MyControllingFunction(LPVOID pParam); 

      參數(shù)pParam 是調(diào)用線程傳遞給線程函數(shù)pfThreadProc的參數(shù);

      其他參數(shù)一般只需采用缺省值。

      指針參數(shù)通信方式就是通過(guò)參數(shù)pParam在線程間通信的,它可為指向任何數(shù)據(jù)類型的指針。本文中,定義了一個(gè)名叫EXCHANGE_INFO的結(jié)構(gòu)如下:

      typedef struct

  { SOCKET sServerSocket;

      SOCKET *pcCoientSocket;

      SOCKADDR_IN *pClientAddr;

      BOOL *pbConnected;

      unsigned char *pucBuffer;

      int *pnMessageLen;

 }  EXCHANGE_INFO;

      在需要通信時(shí),先聲明一個(gè)結(jié)構(gòu)變量,再把變量的指針作為pParam參數(shù),調(diào)用AfxBeginThread((AFX_THREADPROC) CSocketThread::WaitFor ConnectThread,(LPVOID)& m_Exchangeinfo)函數(shù)即可。

      為了利用面向?qū)ο蠹夹g(shù)編程所具有的模塊性強(qiáng)、便于修改、可移植性好等優(yōu)點(diǎn),本文還把表1中的線程封裝為父類為CWinThread的自定義類CSocketThread中。還自定義了一個(gè)叫CSocketComm的新類,封裝了一些函數(shù),如CreateSocket、ConnectToServer、WaitForClient、ReadMessage、SendMessage等,這些函數(shù)屏蔽了面向連接的通信程序的實(shí)現(xiàn)細(xì)節(jié),如創(chuàng)建、連接、發(fā)送和接收等,在這些函數(shù)里,動(dòng)態(tài)創(chuàng)建輔助線程。

      下面以CSocketComm類中的等待客戶連接請(qǐng)求的函數(shù)WaitForClient()為例,注釋說(shuō)明多線程編程的具體細(xì)節(jié)。

      BOOL CSocketComm::WaitForClient

  {    

    if(m_bConnected)return( TRUE );

       //配置bind函數(shù)的參數(shù)即服務(wù)器的套接字地址結(jié)構(gòu)

     SOCKADDR_IN Addr;

      memset(&Addr,0,sizeof(SOCKADDR_IN));

      Addr.sin_family=AF_INET;

      ADDR.SIN_port= htonl(m_nPort); 

      Addr.sin_addr.s_addrr = htonl(INADDR_ANY); 

     //將套接字地址結(jié)構(gòu)賦予套接字(綁定),以指定本地半相關(guān)

      int nReturnValue;

      nReturnValue =::bind( m_sSserverSocket,( LPSOCKADDR)&Addr,sizeof (SOCKADDR_IN )); 

     if(nReturnValue == SOCKET_ERROR)  returu( FALSE );

       //配置傳給WaitForConnectThread線程函數(shù)的參數(shù)m_Exchangeinfo

       m_Exchangeinfo.sServerSocket = m_sserverSocket;

       m_Exchangeinfo.psClientSocket = &m_sClientSocket;

        m_Exchangeinfo.pClientAddr = &m_ClientAddr;

      m_Exchangeinfo.pbConnected = &m_bConnected;

 。詍_Exchangeinfo的指針為參數(shù)調(diào)用WaitforConnectThread線程等待客戶端連接

     AfxBeginThread((AFX_THREADPROC)CSocketThread::

     WaitForConnectThread,(LPVOID) &m_Exchanginfo); 

      returi( TRUE )

}

      //等待連接線程

    UINT CSocketThread::WaitForConnectThread(LPVOIDpParam)

{

      EXCHANGE_INFO*pExchangelnfo=(EXCHANGE_INFO*) pParam;

     int nReturnValue, nClientAddrSize= Sizeof( SOCKADDR_IN);

      //偵聽連接

      nReturnValue=:: listen(pExchangelnfo ->sServerSocket, 1); 

      if( nReturnValue == SOCKET_ERROR )return(0);

       //阻塞調(diào)用accept,直至有客戶連接請(qǐng)求

  *pExchangelnfo->psClitentSocket=:: accept(pExchangelnfo->sServerSocket, (LPSOCKADDR) pEchangelnfo ->pClientAddr,&nClientAddrSize); 

      if(( *pExchangelnfo->psClitentSocket)!= INVALID_SOCKET)

       //通過(guò)pExchangelnfo的指針在線程間通信

  * pExchangelnfo->pbConnected TRUE;

      return( 0 );

    3 應(yīng)用實(shí)例-高層協(xié)議的設(shè)計(jì)

      在電廠和電站中,為了保證安全工作,保護(hù)系統(tǒng)必不可少。保護(hù)系統(tǒng)的電源供應(yīng)通常使用兩種方式。一般情況下,使用交流電系統(tǒng)對(duì)保護(hù)系統(tǒng)進(jìn)行供電;當(dāng)交流電系統(tǒng)出現(xiàn)故障時(shí)立即使用后備的蓄電池系統(tǒng)對(duì)保護(hù)系統(tǒng)進(jìn)行供電。為了對(duì)蓄電池系統(tǒng)進(jìn)行監(jiān)控和管理,以保證蓄電池在關(guān)鍵時(shí)刻能正常工作,設(shè)計(jì)了在Windows NT環(huán)境下具有遠(yuǎn)程通訊功能和動(dòng)態(tài)人機(jī)界面的智能蓄電池遠(yuǎn)程監(jiān)控系統(tǒng) 。該系統(tǒng)由蓄電池智能管理、充電機(jī)控制、母線絕緣在線檢測(cè)、聲光報(bào)警、系統(tǒng)組態(tài)、遠(yuǎn)程通信等子系統(tǒng)組成,實(shí)現(xiàn)對(duì)蓄電池/充電機(jī)智能化遠(yuǎn)程管理和控制,對(duì)整個(gè)系統(tǒng)的運(yùn)行狀態(tài)進(jìn)行實(shí)時(shí)監(jiān)控,具有多媒體報(bào)警、事件處理、動(dòng)態(tài)數(shù)據(jù)庫(kù)、趨勢(shì)畫面和動(dòng)態(tài)畫面顯示、操作提前提醒等功能。系統(tǒng)框圖如圖2所示。在遠(yuǎn)程通信模塊中,遠(yuǎn)程監(jiān)控機(jī)需把監(jiān)控客戶的操作命令及時(shí)傳給本地機(jī),本地機(jī)根據(jù)命令控制充電機(jī),使之按照一定的方式工作,而本地機(jī)需定時(shí)向遠(yuǎn)程監(jiān)控機(jī)反饋實(shí)時(shí)的充電機(jī)狀態(tài)信息。它們之間的通信是基于TCP/IP的廣域網(wǎng)通信,而且,我們引進(jìn)了多線程機(jī)制以保證系統(tǒng)具有良好的實(shí)時(shí)性。

      下面以其中的充電機(jī)控制系統(tǒng)為例談?wù)勅绾问褂肅SocketComm類進(jìn)行遠(yuǎn)程通信。為簡(jiǎn)單起見,假定本地機(jī)與遠(yuǎn)程監(jiān)控機(jī)之間通信的信息僅有下面三種類型:

        ·本地機(jī)接收到該命令后,控制充電機(jī)按照穩(wěn)壓模式運(yùn)行,輸出電壓為電壓給定值;

        ·本地機(jī)接收到該命令后,控制充電機(jī)按照穩(wěn)流定時(shí)模式運(yùn)行,輸出電流為電流給定值;

        ·本地機(jī)向遠(yuǎn)程監(jiān)控機(jī)發(fā)送充電機(jī)的實(shí)時(shí)狀態(tài)數(shù)據(jù)(包括輸出電壓、輸出電流、狀態(tài)指示和故障類型指示)。

      在基于TCP/IP的面向連接的網(wǎng)絡(luò)通信中,客戶與服務(wù)器之間傳送的是有序可靠的字節(jié)流(Byte Stream),所以程序員有必要在傳輸層TCP上定義自己的高層協(xié)議,設(shè)計(jì)幀結(jié)構(gòu),將字節(jié)流變成有意義的信息。在CSocketComm類中由AssembleMessage()函數(shù)把數(shù)據(jù)組合成一定的幀結(jié)構(gòu)。幀結(jié)構(gòu)為:

      其中@為幀起始標(biāo)志,#為幀終結(jié)標(biāo)志

      對(duì)應(yīng)的結(jié)構(gòu)定義如下:

      typedef struct

{   int MessageType; //信息類型

      int ChargerNo; //充電機(jī)編號(hào)

      int DataNo; //數(shù)據(jù)類型

      float Data; //數(shù)據(jù)

}  MessageStruct;

       需要通信時(shí),先聲明一個(gè) MessageStruct變量,根據(jù)信息內(nèi)容對(duì)各成員變量賦值,傳給 AssembleMessage()函數(shù)組合成幀,再調(diào)用SendMessage()函數(shù)發(fā)送給接受方。接受方接到數(shù)據(jù)后,對(duì)數(shù)據(jù)內(nèi)容的解釋,是由CsocketComm類中的AnalyzeMessage()函數(shù)完成的。AnalyzeMessage()函數(shù)返回一個(gè) MessageStruct變量。應(yīng)用程序就可根據(jù)它的各成員變量控制充電機(jī)或動(dòng)態(tài)顯示充電機(jī)的狀態(tài)。

      總之,把多線程機(jī)制引進(jìn)通信,有利于提高應(yīng)用程序的實(shí)時(shí)性,充分利用系統(tǒng)資源。對(duì)于大型的工程應(yīng)用來(lái)說(shuō),不同的線程完成不同的任務(wù),也有利于提高程序的模塊化,便于維護(hù)和擴(kuò)展。本文給出了一種在Windows NT下基于TCP/IP協(xié)議的多線程通信的基本方法,根據(jù)該方法進(jìn)行修改和擴(kuò)充,便可設(shè)計(jì)出符合具體應(yīng)用的高質(zhì)量的多線程通信程序。

    參考文獻(xiàn)

    1 蔣東興,林鄂華.Windows Socket 網(wǎng)絡(luò)程序設(shè)計(jì)指南.北京:清華大學(xué)出版社,1995

    2 Rajagopal Raj,Monica Subodh p.Windows NT4高級(jí)程序設(shè)計(jì).北京:機(jī)械工業(yè)出版社,1998

    (收稿日期:1999-07-13)

 

 

 

 

   

 

 

 

  • 上一篇: 基于80C196KC微處理器的高速串行通訊
  • 下一篇: 多點(diǎn)共線無(wú)中心載波集團(tuán)電話系統(tǒng)
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁(yè)  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營(yíng)許可證:浙B2-20080178-1