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

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

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

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

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



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



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



4 使用CAsyncSocket編程的程序框架
    在進(jìn)行C/S編程之前,需在定義應(yīng)用程序行為的文件030 303.cpp中的Initlnstance()函數(shù)里調(diào)用AfxSocketInit()函數(shù)來初始化Wind ows Sockets。
    (1)服務(wù)器端
    以public的方式從CAsyncSocket類派生新類CServerSock,并重載OnAccept、OnReceive、OnSend函數(shù)。
    函數(shù)重載完成后,在主窗口構(gòu)造新的CServeSock對(duì)象,用來監(jiān)聽來自客戶機(jī)的連接,添加代碼如下:
    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:等待連接的最大隊(duì)列長(zhǎng)度。
    此時(shí)服務(wù)器開始監(jiān)聽來自客戶機(jī)的連接請(qǐng)求。
    (2)客戶機(jī)端
    以public的方式從CAsyncSocket類派生新類CClientSock,與服務(wù)器端類似,重載OnReceive()、OnSend()函數(shù)。
    已經(jīng)搭建好使用CAsyncSocket類實(shí)現(xiàn)基于TCP協(xié)議的異步網(wǎng)絡(luò)通訊的框架,具體的應(yīng)用程序可以在此基礎(chǔ)上進(jìn)行豐富與修改。

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

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

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉