• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    基于WinSocket的網絡通信實現

    發布: 2007-7-14 21:11 | 作者: 佚名    | 來源: 網絡轉載     | 查看: 38次 | 進入軟件測試論壇討論

    領測軟件測試網 陳廣奕

      VC++中,MFC編程支持兩種利用Windows Sockets進行網絡通信的編程模式,這兩種模式即為用CAsyncSocket類和派生于CAsyncSocket 的CSocket類。

     。 CAsyncSocket類封裝了Windows Sockets API函數,提供了較低層的與Windows Sockets對話接口,一般適合于有相當水平的網絡編程基礎者使用,可方便地進行底層的網絡事件通知及信息回叫控制等操作。

     。 CSocket派生于CAsyncSocket,它繼承了父類中一些常用易懂得的Windows Sockets API函數,并對CAsyncSocket中底層的較難控制的一些API函數或成員函數進行了處理,它通過MFC CArchive 對象進行信息的接發操作,使得網絡傳輸如同使用MFC的文檔連載協議(Serialization protocol),簡捷易用。同時它支持模塊化的后臺信息處理,解決了CAsyncSocket中較難克服的多線程處理。


      Socket的建立與使用操作


      作為服務器,需要有一專用于接聽的Socket,以便于隨時接收從客戶發送來的信息,CSocket類的Listen本身支持多線程,故而不必為其開辟新的線程。建立Windows Sockets的操作步驟見表1。


    服務器Socket的建立與使用


     。 在服務器應用程序中聲名Socket全局變量,并使其處于聽等狀態以等待客戶端與其建立連接:

      CListeningSocket m—pSocket;

      m—pSocket = new CListeningSocket(this);

    if (m—pSocket-〉Create(Dialog.m—nPort+700))

    { if (m—pSocket-〉Listen())

    return TRUE;

    }

     。 當接到客戶端的主動連接時或接到數據時,調用文檔類接收新客戶的處理函數:

      void CListeningSocket::OnAccept(int nErrorCode)

      { CSocket::OnAccept(nErrorCode);

    m—pDoc-〉ProcessPendingAccept(); //調用文檔類成員函數,以生成新的對話線程

      }

     。 服務器Socket的網上數據發送與接收操作:

      void CClientSocket::SendMsg(CMsg pMsg)

      { if (m—pArchiveOut != NULL)

    { pMsg-〉Serialize(m—pArchiveOut);

      //調用按協議自定義信息類(CMsg)的函數

    m—pArchiveOut-〉Flush();

      //Serialize進行網上信息發送操作

    } }

      void CClientSocket::ReceiveMsg(CMsg pMsg)

      { pMsg-〉Serialize(m—pArchiveIn); } //調用按協議自定義信息類(CMsg)的函數

      //Serialize進行網上信息接收操作


      客戶端建立連接與通信實現


     。 新客戶與服務器端建立連接:

      BOOL CChatDoc::ConnectSocket(LPCTSTR lpszHandle, LPCTSTR lpszAddress, UINT nPort)

      { m—strHandle = lpszHandle;

    m—pSocket = new CChatSocket(this);

    if (!m—pSocket-〉Create())

    {...} // 創建新Socket失敗處理

      while (!m—pSocket-〉Connect(lpszAddress, nPort + 700))

      {...} //與服務器建立連接失敗后的處理

    m—pFile = new CSocketFile(m—pSocket);

    m—pArchiveIn = new CArchive(m—pFile,CArchive::load);

    m—pArchiveOut = new CArchive(m—pFile,CArchive::store);// 建立通信流對象

    return TRUE; }

     。 客戶端從流中讀入網上信息:

      void CChatDoc::ReceiveMsg()

      { CMsg msg;

    TRY { msg.Serialize(m—pArchiveIn);

      //調用按協議自定義信息類(CMsg)的函數

    while(!msg.m—msgList.IsEmpty()) //Serialize進行網上信息接收操作

    {...

    CATCH(CFileException, e) {... } END—CATCH // 出錯處理

    if (msg.m—bClose)

    {...} // 關閉連接的善后處理

      }

     。 客戶端通過流進行網上發送信息:

      void CChatDoc::SendMsg(CString& strText,int index,int i)

      { if (m—pArchiveOut != NULL)

    { CMsg msg;

       msg=AssembleMsg(index,i);

      // 裝配信息

    TRY { msg-〉Serialize(m—pArchiveOut); //調用按協議自定義信息類(CMsg)的函數

    m—pArchiveOut-〉Flush();

      // Serialize進行網上信息發送操作

    }

    CATCH(CFileException, e)

    { ...... } // 出錯處理

    END—CATCH

    }

      }

      表1

       服務器端 注釋 客戶端
    1 csocket socksrvr; 構造一個socket對象 csocket sockclient;
    2 socksrvr.create(nport); 創建socket sockclient.create(nport);
    3 socksrvr.listen(); 聽等
    連接 與服務器
    建立連接 sockclient.connect
    (straddr,nport);
    4 csocket sockrecv;
    socksrvr.accept(sockrecv); 構造新的socket對象用以接收客戶端的連接     
    5 csocketfile file(&sockrecv); 構造一文件對象 csocketfile file
    (&sockrecv);
    6 carchive arin
    (&file,carchive::load);
    carchive arout
    (&file,carchive::store); 構造流對象 carchive arin
    (&file,carchive::load);
    carchive arout
    (&file,carchive::store);
    7 arin〉〉dwvalue;
    arout〈〈dwvalue; 用流進行數據的傳輸 arin〉〉dwvalue;
    arout〈〈dwvalue; 

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>