關 閉

        新聞中心

        EEPW首頁 > 工控自動化 > 設計應用 > Windows平臺下的網絡異步通訊編程技術

        Windows平臺下的網絡異步通訊編程技術

        作者: 時間:2012-04-28 來源:網絡 收藏

        2 CAsyncSocket類的簡單介紹
        微軟公司開發的Visual C++是平臺下強有力的開發工具。VC++對編程的支持有socket支持,WinInet支持,MAPI和ISAPl支持等,其中 Sockets API是TCP/IP環境下開發最為通用的API。為簡化WinSock編程,使用戶專注于應用程序的算法設計,Microsoft的基本類庫(Microsoft Foundation Class,MFC)提供了兩個用于Winsock編程的類,分別是CAsyncSocket類和CSocket類:這兩個類在不同程度上對WinSock API函數進行了封裝,具有直接調用Sockets API的靈活性。CAsyncSocket類是從CObject類派生出來的,在很低的級別上一對一封裝了 Sockets API,因此具有直接調用Socket API的靈活性,可以使用面向對象的方式進行Socket編程,CAsync Soc ket類可以方便地調用其他MFC對象,處理多個網絡協議。與CSocket類相比,CAsyncSocket類有以下特點。
        2.1 CAsyncSocket類對象的創建
        CAsyncSocket是一個異步非阻塞Socket封裝類,CAsvncSocket的Create()函數,除創建了一個Socket以外,CAsyncSocket::Create()的參數IEvent指明了想要處理的Socket事件,關心的事件被指定以后,這個Socket默認就被用作了異步方式。CAsyncSocket還創建了個CSoc ketWnd窗口對象,并使用WSAAsyncSelect()將這個SOCKET與該窗口對象關聯,以使該窗口對象處理來自Socket的事件(消息),然而CSocket Wnd收到Socket事件之后,只是簡單地回調CAsyncSocket::OnReceive()等虛函數。所以CAsyncSocket的派生類,只需在這些虛函數里添加發送和接收的代碼,除此外Create()函數還調用Bind()函數將Socket對象與指定的地址綁定。其函數原型為:
        BOOL CAsyncSocket::Create(UINT nSocketPort=0,intnSocketType=SOCK_STREAM,long lEvent=FD_READ|FD_WRITE|FD_OOB|FD_ACC EPT|FD_CONNECT|FD_CLOSE,LPCTSTR lpszSocketAddress=NULL);
        在重載函數中都有一個參數nErrorCode,為零則表示正常完成,非零則表示錯誤。通過int CAsyncSocket::GetLastError()可以得到錯誤值。參數nSocketPort為使用的端口號,為零則表示由系統自動選擇,通常在客戶端都使用這個選擇。參數nSocketType為使用的協議族,SOCK_STREAM表明使用有連接的服務,SOCK_DGRAM表明使用無連接的數據報服務。參數lpszSocketAddress指定了IP地址,可以使用點分法表示如192.168.0.28,也可以使用默認值,此時函數將默認綁定本機IP地址。
        2.2 CAsyncSocket類的異步選擇機制
        在網絡通訊中,由于網絡擁擠或數據量大的原因,數據的收發不能立刻完成,收發數據的函數因此不能返回,從而出現阻塞現象。Win Sock對有可能阻塞的函數提供了兩種處理方式:阻塞和非阻塞方式。在阻塞方式下,收發數據的函數在被調用后一直要到傳送完畢或者出錯才能返回。對于非阻塞方式,函數被調用后立即返回,傳送完成后由WinSock給程序發一個事先約定好的消息。使用Windows Sockets實現Windows網絡程序設計的關鍵就是它提供了對網絡事件基于消息的異步存取,用于注冊應用程序感興趣的網絡事件。Winsock過WSAAsyncse lect()動地設置套接字處于非阻塞方式,注冊一個或多個網絡事件。當被提名的網絡事件發生時,Windows應用程序的窗口函數將收到一個消息,消息附帶的參數指示被提名過的某一網絡事件。WSAAsyncSelect的原型如下:
        int PASCAL FAR WSAAsyncSelect(SOCTET s,HWND hWnd,unsignedint wMsg,long lEvent)它請求Windows Sockets DLL在檢測到套接字上發生的網絡事件時,向窗口hWnd發送一個消息。MFC在實現CAsyncSocket類時,定義了一個內部類CSocket Wnd,當使用Create函數產生Socket句柄時,就Attach這個Socket到一個窗口上,并且CAsyncSocket的DoCallBack函數為該窗口的回調函數。在此函數內根據不同的消息參數,響應各個網絡事件。
        2.3 CAsyncSocket對網絡事件的響應
        在理解以上機制后,再了解一下CAsyncSocket的通信流程。
        CAsvncSocket在AsyncSelect函數中調用WSAAsyncselect函數注冊感興趣的網絡事件。這樣,當一個網絡事件發生時,經過MFC的消息循環,就可以由CAsyncSocket的DoCAllBack函數按事件的類型:FD_READ,FD_WRITE,FD_ACCEPT,FD_CONNECT和FD_CLOSE來分別調用OnReceive(),OnSend(),OnAccept(),OnConnect()和OnClose()函數。具體的對應關系如表1所示。

        本文引用地址:http://www.104case.com/article/202341.htm

        b.JPG


        tcp/ip相關文章:tcp/ip是什么




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 沁水县| 孝义市| 凤阳县| 淮阳县| 宜兰县| 丘北县| 巴彦县| 乐陵市| 定州市| 景德镇市| 达州市| 沙坪坝区| 黎平县| 宜君县| 周至县| 嘉义县| 宣威市| 天等县| 峡江县| 昌图县| 武川县| 玛纳斯县| 合川市| 安溪县| 曲麻莱县| 云安县| 肥东县| 南江县| 太仓市| 防城港市| 葫芦岛市| 四川省| 梁山县| 高尔夫| 句容市| 咸丰县| 喀喇| 布尔津县| 福鼎市| 营口市| 额济纳旗|