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

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

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

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

    用Visual C++ 4.0 實現Windows 95 Socket編程

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

    領測軟件測試網 作者: 李 大 琪

      Windows 95 Socket 提 供 了 在 Microsoft Windows 95 中 進 行 網 絡 程 序 設 計 的 一 個 接 口, 它 是 在 Unix Socket 的 基 礎 上 發 展 而 來 的, 不 僅 保 留 了Unix Socket 原 有 的 風 格, 而 且 還 融 入 了 適 合 于 Windows 95 的 新 特 點, 這 使 得 用 戶 可 以 利 用 Windows 95 Socket API 直 接 進 行 進 程 與 應 用 程 序 間 的 通 信。Windows 95 在Internet 支 配 域 中 的TCP/IP 協 議 定 義 了 Socket 編 寫 規 程, 使 用 Socket 的 目 的 是 使 用 戶 在 網 絡 協 議 上 工 作 而 不 必 對 該 網 絡 協 議 有 非 常 深 入 的 了 解。 此 外, 這 樣 編 寫 的 程 序 可 被 迅 速 移 植 到 任 何 支 持 Socket 的 網 絡 系 統 中 去。

      Microsoft Windows Class Library( MFC ) 中 提 供 了 CSocket 類 用 來 實 現 網 絡 通 信。 圖 一 中 給 出 了CSocket 類 的 繼 承 關 系。

       下 面 將 介 紹 用Visual C++ 4.0 在Windows 95 中 實 現 Socket 的 CSocket 類 相 關 成 員 函 數( 這 些 成 員 函 數 實 際 上 是 從CAsyncSocket 類 繼 承 來 的 )。

     。1) BOOL Create( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM, long lEvent = FD_READ |FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT| FD_CLOSE,LPCTSTR lpszSocketAddress = NULL )

       該 函 數 用 來 建 立Socket。 其 中,nSocketPort 為 所 選 擇 的 Socket 端 口, 一 般 要 大 于 1023, 如 果 該 參 數 為 0, 則 由 系 統 選 定 一 端 口, 默 認 值 為 0 ;nSocketType 為 套 接 字 類 型 :SOCK_STREAM 表 示 為 流 套 接 字, SOCK_DGRAM 表 示 為 數 據 報 套 接 字, 默 認 值 為 SOCK_STREAM ;lEvent 標 識 該 Socket 要 完 成 哪 種 工 作, 默 認 值 為FD_READ|FD_WRITE|FD_OOB| FD_ACCEPT|FD_CONNECT|FD_CLOSE ;lpszSockAddress 為 網 絡 地 址 信 息 結 構 指 針, 包 含 網 絡 地 址 , 默 認 值 為 NULL 。

     。2)BOOL Bind( UINT nSocketPort, LPCTSTR lpszSocketAddress = NULL )

       該 函 數 的 作 用 是 將Socket 端 口 與 網 絡 地 址 連 接 起 來。 參 數 含 義 同 上 。

     。3)BOOL Listen( int nConnectionBacklog = 5 )

       該 函 數 的 作 用 是 等 待Socket 請 求。 其 中,nConnec-tionBacklog 表 示 等 待 隊 列 的 長 度, 默 認 值 為 最 大 值 5 。

     。4)virtual BOOL Accept( CAsyncSocket& rConnectedSocket, SOCKADDR* lpSockAddr = NULL, int* lpSockAddrLen = NULL )

       該 函 數 的 作 用 是 取 得 隊 列 上 第 一 個 連 接 請 求 并 建 立 一 個 具 有 與Socket 相 同 特 性 的 套 接 字。 其 中,rConnectedSocket 表 示 一 個 新 的 Socket 。

     。5)BOOL Connect( LPCTSTR lpszHostAddress, UINT nHostPort )

       該 函 數 的 作 用 是 提 出 請 求。 其 中,lpszHostAddress 和 nHostPort 為 接 受 請 求 進 程 的 網 絡 地 址 和 Socket 端 口 號 。

     。6)virtual void Close( )

       該 函 數 的 作 用 是 關 閉 該 Socket 。

       利 用 CSocket 類 直 接 進 行 數 據 通 信 有 兩 種 方 式 : 一 種 是 利 用 CSocketFile 類 和 Archive 類 去 實 現, 另 一 種 是 利 用 CSocket 的 成 員 函 數 Receive、Send、ReceiveFrom、SendTo、Listen 和 Accept 等 來 實 現( 這 些 成 員 函 數 實 際 上 也 是 從CAsyncSocket 類 繼 承 的)。

       兩 種 方 法 的 實 現 步 驟 如 下 :

      Server : Construct-> Creat-> Bind -> Listen-> Accept-> Send->Close ;

      Cilent : Construct ->Creat-> Connect-> Receive-> Close。

       下 面 我 就 用 Visual C++ 4.0 的 代 碼 段 分 別 介 紹 如 何 運 用 上 述 兩 種 方 法 來 實 現Socket 編 程。

      1、 利 用 CSocketFile 類 和 Archive 類 實 現

     。1)Server

      // construct a socket

      CSocket sockSrvr;

      // create the SOCKET

      sockSrvr.Create(nPort);

      // start listening

      sockSrvr.Listen( );

      //construct a new, empty socket

      CSocket sockRecv;

      // accept connection

      sockSrvr.Accept( sockRecv );

      // construct file object

      CSocketFile file(&sockRecv);

      // construct an archive

      CArchive arIn(&file, CArchive::load);

      /*or*/_CArchive arOut(&file, CArchive::store);

      // use the archive to pass data

      arIn >> dwValue;

      /*or*/ arOut << dwValue;

     。2)Client

      // construct a socket

      CSocket sockClient;

      // create the SOCKET

      sockClient.Create( );

      // seek a connection

      sockClient.Connect(strAddr, nPort);

      // construct file object

      CSocketFile file(&sockClient);

      // construct an archive

      CArchive arIn(&file, CArchive::load);

      /*or*/_CArchive arOut(&file, CArchive::store);

      // use the archive to pass data

      arOut << dwValue;

      /*or*/ arIn >> dwValue;

       上 述 為 Client/Server 模 式 的 兩 個 進 程, 用 于 完 成 兩 個 進 程 間 一 個 數 據 變 量 的 通 信。 其 中, nPort 是Socket 的 端 口 號,strAddr 是 該 機 器 的IP 地 址( 如 202.197.1.3 或 FTP://RedAlert.com 等), 這 兩 個 變 量 在Server 和Client 中 要 一 致。 當Server 進 程 運 行 至 Listen 后 便 處 于 睡 眠 狀 態 直 到 Client 進 程 執 行 Connect 時 才 被 喚 醒, 而 后 兩 個 進 程 便 開 始 傳 輸 數 據 了。

      2、 利 用 CSocket 的 成 員 函 數 實 現

     。1)Server

      // Socket initial

      if(!AfxSocketInit()){

       MessageBox("WindowsSocket initial

       failed!","Send",MB_ICONSTOP);

       Return;

      }

      // Construct two socket

      CSocket ChatSend,server;

      // Creat a SOCKET

      if(!ChatSend.Create(nPort)) // nPort=1025

       MessageBox("SendSocket create failed!", "Send",MB_ICONSTOP);

      else{

       // Associates a local address with the socket ChatSend.Bind(nProt,strAddr);

      // strAddr="202.196.111.1"

       // Start Listening

       ChatSend.Listen();

       // Creat a new socket and accepts a connection on

       //the socket

       ChatSend.Accept(Server);

      }

      // Send a CString

      Server.SendTo(csSendText,csCounts,nPort,strAddr);

      // Close the two socket

      Server.Close();

      ChatSend.Close();

     。2)Client

      // Socket initial

      if(!AfxSocketInit()){

       MessageBox("WindowsSocket initial failed!", "Receive",MB_ICONSTOP);

       return;

      }

      // Construct a socket

      CSocket ChatRecieve;

      // Creat a SOCKET

      if(!ChatReceive.Create()){

       MessageBox("ReceiveSocket create

       failed!","Receive",MB_ICONSTOP);

       return;

      }

      else{

       // Establishes a connection to a peer socket

       ChatReceive.Connect(strAddr,nPort);

      }

      // Receive the CString

      ChatReceive.ReceiveFrom(csReceiveText,csCounts,strAddr,nPort);

      // Close the socket

      ChatReceive.Close();

       上 述 兩 個 進 程 完 成 的 工 作 是 : 由Server 進 程 發 送 一 字 符 串,Client 進 程 接 收。 strAddr 和 nPort 的 含 義 與 方 法1 中 的 相 同 ;csSendText 和 csReceiveText 為 發 送 與 接 收 的 字 符 串 ;csCounts 為 字 串 長 度, 這 一 長 度 在 兩 個 進 程 中 要 求 接 收 長 度 小 于 或 等 于 發 送 長 度, 否 則 會 導 致 數 據 傳 輸 錯 誤。 另 外, 在 程 序 中 要 加 入 頭 文 件afxsock.h, 因 為CSocket 類 的 有 關 說 明 均 在afxsock.h 中。

       從 上 述 兩 種 方 法 中 不 難 發 現, 方 法1 適 合 于 對 多 個 不 同 類 型 數 據 的 通 信, 方 法2 適 合 于 對 字 符 串 的 通 信, 具 體 選 用 何 種 方 法 則 取 決 于 具 體 應 用 的 需 求。

    延伸閱讀

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


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