www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 智能硬件 > 智能硬件
[導讀]摘要 介紹了在TCP/IP網(wǎng)絡中WinSock網(wǎng)絡編程的基本流程及WinSock編程常用的兩種類,集中探討了MFC提供的異步非阻塞類CAsyncSocket的特點,包括類對象的創(chuàng)建、異步選擇機制以及對網(wǎng)絡事件的響應。以及采用CAsyncSocke

摘要 介紹了在TCP/IP網(wǎng)絡中WinSock網(wǎng)絡編程的基本流程及WinSock編程常用的兩種類,集中探討了MFC提供的異步非阻塞類CAsyncSocket的特點,包括類對象的創(chuàng)建、異步選擇機制以及對網(wǎng)絡事件的響應。以及采用CAsyncSocket類進行網(wǎng)絡通信的通信流程,并結合實際開發(fā)經(jīng)驗,介紹了使用CAsyncSocket類進行網(wǎng)絡編程的基本框架。通過使用可大大提高編程的效率。
關鍵詞 TCP/IP;WinSock;異步通訊;非阻塞;CasyncSocket

    隨著Internet技術的應用和普及,多數(shù)應用程序都是運行在網(wǎng)絡環(huán)境下,這就要求程序員能在應用最廣泛的Windows操作系統(tǒng)上開發(fā)網(wǎng)絡應用程序。文中介紹了WinSock編程的基本流程,并利用MFC提供的CAsyncSocket類,結合在VS2008環(huán)境下實際的開發(fā)經(jīng)驗,介紹了Windows平臺下基于TCP的異步網(wǎng)絡編程的相關知識。

1 WinSock編程的基本流程
    在TCP/IP網(wǎng)絡中,兩個進程間相互作用的主要模式是客戶機/服務器模式,該模式的建立基于以下兩點:(1)非對等作用。(2)通信完全是異步的。客戶機/服務器模式在操作過程中采取的是主動請示方式。面向連接(TCP)的典型過程如圖1所示。



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



3 使用CAsyncSocket類的通訊流程
    在理解了上述的機制后,CAsyncSocket的通信流程:客戶方在使用CAsyncSocket::Connect()時,往往返回一個WSAEWOULDBLOCK的錯誤,實際上這不應該算作一個錯誤,它是Socket的提醒,由于使用了非阻塞Socket方式,所以操作需要時間,不能瞬間建立。那么可以等待,等待連接成功,于是許多程序員就在調(diào)用Connect()之后,Sleep(0),然后不停地用WSAGetLastError()或者CAsyncSocket::GetLast Error()查看Socket返回的錯誤,直到返回成功為止。這是一種錯誤的做法,斷言不能達到預期目的。事實上,可以在Connect()調(diào)用之后等待CAsyncSocket::OnConnect()事件被觸發(fā)。類似地,Send()如果返回WSAEWOULDBLOCK錯誤,在OnSend()處等待,Receive()如果返回WSAE WOULDBLOCK錯誤,則在OnReceive()處等待,具體的內(nèi)部通信流程如圖2所示。



4 使用CAsyncSocket編程的程序框架
    在進行C/S編程之前,需在定義應用程序行為的文件030 303.cpp中的Initlnstance()函數(shù)里調(diào)用AfxSocketInit()函數(shù)來初始化Wind ows Sockets。
    (1)服務器端
    以public的方式從CAsyncSocket類派生新類CServerSock,并重載OnAccept、OnReceive、OnSend函數(shù)。
    函數(shù)重載完成后,在主窗口構造新的CServeSock對象,用來監(jiān)聽來自客戶機的連接,添加代碼如下:
    CServeSock m_ListenSock;//m_ListenSock為監(jiān)聽套接字
    m_ListenSock.Create(m_Port,SOCK_STREAM,F(xiàn)D ACCEPT|FD_READ|FD_WRITE|FD_CLOSE)
    m_ListenSock→Listen(int nConnectionBacklog=5);
    函數(shù)Send()的參數(shù)說明:
    nconnectionBacklog:等待連接的最大隊列長度。
    此時服務器開始監(jiān)聽來自客戶機的連接請求。
    (2)客戶機端
    以public的方式從CAsyncSocket類派生新類CClientSock,與服務器端類似,重載OnReceive()、OnSend()函數(shù)。
    已經(jīng)搭建好使用CAsyncSocket類實現(xiàn)基于TCP協(xié)議的異步網(wǎng)絡通訊的框架,具體的應用程序可以在此基礎上進行豐富與修改。

5 結束語
    CAsyncSocket類為使用Socket提供了方便。建立Socket的WSAStartup過程和bind過程被簡化成為Create過程,IP地址類型轉(zhuǎn)換、主機名和IP地址轉(zhuǎn)換的過程中許多復雜的變量類型都被簡化成字符串和整數(shù)操作,特別是CAsyncSocket類的異步特點,完全可以替代繁瑣的線程操作。MFC提供了大量的類庫,若能靈活地使用,可大大提高編程效率。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

將您的樹莓派Pico變成帶有觸摸屏界面的USB-HID設備!在這個項目中,我們將在Arduino IDE中設置編程環(huán)境,為3.5”Pico Touch LCD屏蔽配置庫,測試基本功能,創(chuàng)建簡單的按鈕(用于復制和粘貼),顯...

關鍵字: 樹莓派 觸摸屏 LCD Windows

這是一個演示,展示了我正在開發(fā)的自定義gpt,并在r/arduino上發(fā)布了一系列關于它的內(nèi)容。它可以很容易地與您的任何項目在您的標準工作。/ Arduino文件夾。它是多平臺的,所以無論你運行的是Windows、mac...

關鍵字: Windows macOS Linux Arduino項目管理器

在這里,我們在相當舊的Latte Panda V1單板計算機上啟動了Batocera,該計算機于2015年發(fā)布,擁有英特爾Atom x5-Z8350四核處理器和4GB DDR3L RAM。這個處理器在當時對于SBC來說是...

關鍵字: 單板計算機 Windows x86處理器

Amazon Q Developer是首個基于生成式AI的助手,旨在加速Windows.NET、VMware和大型機工作負載的遷移和現(xiàn)代化,縮短轉(zhuǎn)型時間并降低成本 北京2024年12月23日 /美通社/ -- ...

關鍵字: DEVELOPER 亞馬遜 NET Windows

Linux上的大多數(shù)軟件都是開源的,開發(fā)者在全球范圍內(nèi)對其進行了維護,并為之作出了貢獻。這就意味著,用戶可以在更大程度上,獲得更大的自由度,更多的選擇。而且,在 Windows中,很多先進的特性和專門的軟件都是需要許可的...

關鍵字: Linux Windows

7月21日消息,據(jù)國外媒體報道,近日全球范圍內(nèi)Windows設備出現(xiàn)大規(guī)模癱瘓事件,不僅導致飛機停飛、醫(yī)院服務中斷,更暴露了全球經(jīng)濟對微軟的深度依賴。

關鍵字: Windows

FTDI Chip高速USB 2.0系列FT4232HA是業(yè)界首款USB2.0高速轉(zhuǎn)四通道UART或雙通道MPSSE的車規(guī)級芯片。

關鍵字: USB2.0 車規(guī)級芯片 Windows

業(yè)內(nèi)消息,近日微軟和高通公司在微軟 Build 2024 會議中宣布,將為開發(fā)者提供 Windows 版驍龍開發(fā)套件(Snapdragon Dev Kit for Windows),用于制作與驍龍X芯片配合使用的 Cop...

關鍵字: 高通 Windows 開發(fā)者 驍龍 開發(fā)套件

好用、高效的多合一傳感器開發(fā)工具,支持給新一代高科技 MEMS 傳感器產(chǎn)品開發(fā)應用軟件

關鍵字: 傳感器 Windows MacOS

雙系統(tǒng)將是下述內(nèi)容的主要介紹對象,通過這篇文章,小編希望大家可以對雙系統(tǒng)的相關情況以及信息有所認識和了解,詳細內(nèi)容如下。

關鍵字: 雙系統(tǒng) Windows Linux
關閉