亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于異步選擇機(jī)制的局域網(wǎng)通信的實(shí)現(xiàn)

        2008-12-31 00:00:00楊小艷白亞秀
        電腦知識(shí)與技術(shù) 2008年9期

        摘要:Internet在我國(guó)日益普及,用戶對(duì)網(wǎng)絡(luò)應(yīng)用的需求也不斷增加,網(wǎng)絡(luò)狀況瞬息萬(wàn)變,如何開(kāi)發(fā)高效的Windows網(wǎng)絡(luò)應(yīng)用程序?qū)W(wǎng)絡(luò)應(yīng)用程序開(kāi)發(fā)人員來(lái)說(shuō)相當(dāng)重要。文中對(duì)Windows Socket、異步選擇機(jī)制進(jìn)行了簡(jiǎn)要的介紹,根據(jù)網(wǎng)絡(luò)編程的原理詳細(xì)介紹了在VC中基于異步選擇機(jī)制的局域網(wǎng)通信的實(shí)現(xiàn)。該方法具有實(shí)時(shí)性、高效性的特點(diǎn),可被廣泛應(yīng)用于C/S結(jié)構(gòu)的軟件中。

        關(guān)鍵詞:Windows Socket;TCP/IP;阻塞;非阻塞;異步選擇機(jī)制

        中圖分類號(hào):TP393文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2008)09-11598-02

        The Implementation of LAN Communication Based on Asynchronous Selection Mechanism

        YANG Xiao-yan, BAI Ya-xiu

        (Ankang University, Ankang 725000, China)

        Abstract: Internet is increasingly universal in our country, customer's needs to network application also increase continuously. For the network condition's fast changing, to network application procedure development personnel, it is very important to develop the highly effective windows network application procedure. The article introduces Windows Socket, Asynchronous Selection Mechanism briefly and the implementation of LAN communication based on the mechanism according to the basic principle of the network correspondence with VC in dail.The method has characteristics of real time and high efficiency, and may be widely applied in C/S structure softwares.

        Key words: Windows Socket; TCP/IP; Blocking; Non-blocking; Asynchronous Selection Mechanism

        1 引言

        Internet在我國(guó)日益普及,用戶對(duì)網(wǎng)絡(luò)應(yīng)用的需求也不斷增長(zhǎng),提高網(wǎng)絡(luò)程序的效率就顯得相當(dāng)重要。網(wǎng)絡(luò)由一系列協(xié)議組成,TCP/IP協(xié)議是當(dāng)今異種機(jī)互聯(lián)的工業(yè)標(biāo)準(zhǔn),它支持不同廠家、不同操作系統(tǒng)的計(jì)算機(jī)之間的通信。TCP/IP協(xié)議族的分層結(jié)構(gòu)中的傳輸層為相互通信的主機(jī)提供了端到端的通信能力。其中,TCP協(xié)議向應(yīng)用層提供可靠的數(shù)據(jù)連接,它保證進(jìn)程間數(shù)據(jù)傳輸?shù)恼_、有序和不重復(fù)。UDP協(xié)議僅僅為應(yīng)用層提供數(shù)據(jù)報(bào)的分組發(fā)送服務(wù),數(shù)據(jù)傳輸?shù)目煽啃灾荒芡ㄟ^(guò)應(yīng)用層來(lái)保證。TCP和UDP的主要差別在于可靠性,TCP高度可用,需要大量功能開(kāi)銷,而UDP是簡(jiǎn)單、高效。由于是在局域網(wǎng)中實(shí)現(xiàn)通信,為了達(dá)到簡(jiǎn)單、實(shí)時(shí)、高效的目的,在介紹Windwins Socket,異步選擇機(jī)制,網(wǎng)絡(luò)通信原理等相關(guān)知識(shí)的基礎(chǔ)上,根據(jù)基于數(shù)據(jù)報(bào)套接字(UDP協(xié)議)的編程步驟,詳細(xì)探討了在VC中基于異步選擇機(jī)制的局域網(wǎng)通信的實(shí)現(xiàn)。

        2 Windows Socket及異步選擇機(jī)制

        2.1 Windows Socket

        套接字(Socket)是建立在傳輸層協(xié)議(主要是TCP和UDP)上的一種套接字規(guī)范,最初是由美國(guó)加州Berkley大學(xué)提出,它定義了兩臺(tái)計(jì)算機(jī)間進(jìn)行通信的規(guī)范,套接字屏蔽了底層通信軟件和具體操作系統(tǒng)的差異,使得任何兩臺(tái)安裝了TCP協(xié)議軟件和實(shí)現(xiàn)了套接字規(guī)范的計(jì)算機(jī)之間的通信成為可能。Windows Scoket是UNIX操作系統(tǒng)下的Bakeley Socket應(yīng)用程序開(kāi)發(fā)接口在Windows環(huán)境下的實(shí)現(xiàn)。Windows Socket規(guī)范主要有WinSock1.1和WinSock2兩個(gè)版本,它們保持了和Bekeley Socket函數(shù)的兼容性,并做出了重要擴(kuò)充。這些擴(kuò)充主要是增加了一些異步請(qǐng)求函數(shù)和對(duì)網(wǎng)絡(luò)事件的異步選擇機(jī)制,使之更適合Windows平臺(tái)消息驅(qū)動(dòng)的特性。

        2.2 異步選擇機(jī)制

        Windows Socket在兩種模式下執(zhí)行I/O操作,阻塞和非阻塞。在阻塞模式下,在I/O操作完成前,執(zhí)行操作的Winsock函數(shù)會(huì)一直等待下去,不會(huì)立即返回程序(將控制權(quán)交還給程序)。Windows Sockets為了支持Windows消息驅(qū)動(dòng)機(jī)制,使應(yīng)用程序開(kāi)發(fā)者能夠方便的處理網(wǎng)絡(luò)通信,它對(duì)網(wǎng)絡(luò)事件采用了基于消息的異步存取策略。Windows Sockets的異步選擇函數(shù)WSAAsyncSelect()提供了消息機(jī)制的網(wǎng)絡(luò)事件選擇,當(dāng)使用它登記的網(wǎng)絡(luò)事件發(fā)生時(shí),Windows應(yīng)用程序相應(yīng)的窗口函數(shù)將收到一個(gè)消息,消息中指示了發(fā)生的網(wǎng)絡(luò)事件,以及與事件相關(guān)的一些信息。這個(gè)函數(shù)自動(dòng)設(shè)置套接字為非阻塞模式。

        Int WSAAsyncSelect(SOCKET s, HWND hWnd, unsigned int wMsg)

        S,標(biāo)識(shí)了請(qǐng)求事件通知的套接字描述符。

        hWnd,標(biāo)識(shí)當(dāng)一個(gè)網(wǎng)絡(luò)事件發(fā)生時(shí),接收消息的窗口的句柄

        wMsg,網(wǎng)絡(luò)事件發(fā)生時(shí),窗口接收到的消息(這里指的是一個(gè)自定義的消息。)

        lEvent,指定應(yīng)用感興趣的網(wǎng)絡(luò)事件。

        3 網(wǎng)絡(luò)通信的基本原理

        網(wǎng)絡(luò)通信實(shí)質(zhì)上是網(wǎng)絡(luò)中的不同主機(jī)進(jìn)程之間的相互通信(可以把同機(jī)進(jìn)程通信看作其中的特例)問(wèn)題。與單純的同機(jī)通信相比,網(wǎng)絡(luò)通信需要解決以下三個(gè)問(wèn)題。第一,標(biāo)識(shí)網(wǎng)絡(luò)中的進(jìn)程。在同一主機(jī)上,不同進(jìn)程可以用進(jìn)程標(biāo)識(shí)符來(lái)標(biāo)識(shí),而在網(wǎng)絡(luò)通信中則是利用端口號(hào)來(lái)標(biāo)識(shí)。端口是TCP和UDP與應(yīng)用程序打交道的訪問(wèn)點(diǎn),是TCP/IP協(xié)議軟件的一部份。TCP/IP協(xié)議規(guī)定了一些標(biāo)準(zhǔn)保留端口,主要提供給服務(wù)器進(jìn)程使用,用戶進(jìn)程可以申請(qǐng)使用非保留端口,其端口的標(biāo)識(shí)符在本機(jī)種具有唯一性。因此可以利用端口號(hào)作為網(wǎng)絡(luò)中進(jìn)程本身的標(biāo)識(shí)。第二,多重協(xié)議的識(shí)別。網(wǎng)絡(luò)中的兩個(gè)進(jìn)程必須使用協(xié)議來(lái)相互通信,而網(wǎng)絡(luò)協(xié)議有多種,這就要求進(jìn)程能夠在眾多的協(xié)議中作出選擇。原因在于不同的協(xié)議地址格式不同、工作方式不同(比如面向連接與無(wú)連接),協(xié)議端口分配是相互獨(dú)立的。綜合以上兩點(diǎn),在網(wǎng)絡(luò)中全局地址標(biāo)識(shí)一個(gè)本地進(jìn)程需要一個(gè)三元組:協(xié)議,本地地址,本地端口號(hào)。而一個(gè)完整的網(wǎng)絡(luò)通信實(shí)例是由通信兩端的進(jìn)程組成,因此需要一個(gè)五元組來(lái)標(biāo)識(shí):協(xié)議,本地地址,本地端口號(hào),異地地址,異地端口號(hào)。這里的本地地址、異地地址是用來(lái)標(biāo)識(shí)計(jì)算機(jī)的,一般是指計(jì)算機(jī)的IP地址。第三,進(jìn)程之間相互作用模式,即應(yīng)用程序相互作用的模式。在網(wǎng)絡(luò)中兩個(gè)應(yīng)用程序間主要的作用模式是客戶機(jī)/服務(wù)器模式,在這種模式中客戶應(yīng)用程序向服務(wù)器程序請(qǐng)求服務(wù),這種方式隱含了在建立客戶機(jī)/服務(wù)器間通信時(shí)的非對(duì)稱性。表1顯示了基于數(shù)據(jù)報(bào)套接字的客戶機(jī)/服務(wù)器編程模型。

        4 基于異步選擇機(jī)制的局域網(wǎng)通信的實(shí)現(xiàn)

        4.1 實(shí)現(xiàn)思想

        根據(jù)數(shù)據(jù)報(bào)套接字的客戶機(jī)/服務(wù)器編程模型,采用Windows Scoket的異步選擇機(jī)制,將服務(wù)器端和客戶端在同一個(gè)程序中實(shí)現(xiàn)。需要通信的計(jì)算機(jī)只要運(yùn)行同樣的程序,通過(guò)輸入對(duì)方的IP地址,或主機(jī)名就可以實(shí)現(xiàn)相互通信。

        4.2 在VC中的具體實(shí)現(xiàn)

        4.2.1 創(chuàng)建基于對(duì)話框的MFC EXE工程

        在應(yīng)用程序類的初始化函數(shù):InitInstance()種調(diào)用如下語(yǔ)句加載套接字庫(kù)進(jìn)行版本協(xié)商。(采用Winsock2版本)

        WSAStartup(wVersionRequested,wsaData);

        if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2)

        {WSACleanup();return FALSE;}

        在預(yù)編譯頭文件中包含頭文件winsock2.h,并鏈接庫(kù)文件ws2_32.lib.

        4.2.2 服務(wù)器端的實(shí)現(xiàn)

        m_socket=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,0);//創(chuàng)建數(shù)據(jù)報(bào)套接字

        SOCKADDR_IN addrSock;//地址結(jié)構(gòu)體的定義

        addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

        addrSock.sin_family=AF_INET;

        addrSock.sin_port=htons(6000);//端口號(hào)為6000

        //將套接字綁定到一個(gè)本地地址和端口上

        bind(m_socket,(SOCKADDR*)addrSock,sizeof(SOCKADDR));

        //采用異步選擇機(jī)制注冊(cè)網(wǎng)絡(luò)讀取事件

        WSAAsyncSelect(m_socket,m_hWnd,UM_SOCK,F(xiàn)D_READ);

        #define UM_SOCK WM_USER+1 //自定義消息UM_SOCK

        afx_msg void OnSock(WPARAM,LPARAM);//消息響應(yīng)函數(shù)原型聲明

        ON_MESSAGE(UM_SOCK,OnSock)//消息映射

        //接收數(shù)據(jù)(消息響應(yīng)函數(shù)的實(shí)現(xiàn))

        OnSock(WPARAM wParam,LPARAM lParam)

        { switch(LOWORD(lParam))//判斷是否是網(wǎng)絡(luò)讀取事件發(fā)生了。

        {case FD_READ:

        if(SOCKET_ERROR==WSARecvFrom(m_socket,wsabuf,1,dwRead, dwFlag,(SOCKADDR*)addrFrom,len,NULL,NULL))

        {MessageBox(\"接收數(shù)據(jù)失??!\");return;}

        str.Format(\"%s說(shuō):%s\",inet_ntoa(addrFrom.sin_addr),wsabuf.buf);

        str+=\"\\r\\";

        GetDlgItemText(IDC_EDIT_RECV,strTemp);

        str+=strTemp;

        SetDlgItemText(IDC_EDIT_RECV,str);

        break;

        }

        }

        4.2.3 客戶端(實(shí)現(xiàn)數(shù)據(jù)的發(fā)送)

        ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP); //獲取服務(wù)器端的IP地址

        SOCKADDR_IN addrTo;// 接收方地址結(jié)構(gòu)體定義

        addrTo.sin_addr.S_un.S_addr=htonl(dwIP);

        addrTo.sin_family=AF_INET;

        addrTo.sin_port=htons(6000);

        //將數(shù)據(jù)發(fā)給服務(wù)器

        if(SOCKET_ERROR==WSASendTo(m_socket,wsabuf,1,dwSend,0,

        (SOCKADDR*)addrTo,sizeof(SOCKADDR),NULL,NULL))

        {MessageBox(\"發(fā)送數(shù)據(jù)失敗!\");return;}

        4.3.4 在應(yīng)用類及對(duì)話框類的析構(gòu)函數(shù)中分別終止套接字庫(kù),關(guān)閉套接字

        WSACleanup();//終止對(duì)套接字庫(kù)的使用

        closesocket(m_socket);//關(guān)閉套接字,釋放與套接字相關(guān)的資源。

        4.3.5 程序運(yùn)行效果如圖1所示

        <E:\\2008學(xué)術(shù)交流\\2008學(xué)術(shù)交流第一卷第九期\\第1次供稿 54\\2網(wǎng)絡(luò)通訊及安全\\yxy02.tif>

        4.3.6 注意問(wèn)題

        編寫網(wǎng)絡(luò)通信程序需要特別注意的是:每一臺(tái)機(jī)器內(nèi)部對(duì)變量的字節(jié)存儲(chǔ)順序不同,而網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)是一定要統(tǒng)一順序的。所以對(duì)內(nèi)部字節(jié)表示順序與網(wǎng)絡(luò)字節(jié)順序不同的機(jī)器,一定要對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)換;在一個(gè)套接字上基于消息請(qǐng)求網(wǎng)絡(luò)事件通知,可以同時(shí)請(qǐng)求多個(gè)網(wǎng)絡(luò)事件,當(dāng)接收到到消息時(shí),需要根據(jù)發(fā)生的網(wǎng)絡(luò)事件作相應(yīng)的處理;網(wǎng)絡(luò)的狀況瞬息萬(wàn)變,在調(diào)用函數(shù)的時(shí)候,應(yīng)對(duì)函數(shù)的返回值進(jìn)行判斷,以便找到出錯(cuò)原因。

        5 結(jié)論

        在Windows平臺(tái)下程序的運(yùn)行都是基于消息的,如果采用阻塞套接字,就會(huì)由于接收函數(shù)的調(diào)用而導(dǎo)致程序暫停運(yùn)行,影響了程序運(yùn)行的效率。采用異步選擇機(jī)制,接收端和發(fā)送端在同一個(gè)程序中,并且采用數(shù)據(jù)報(bào)套接字實(shí)現(xiàn)了局域網(wǎng)通信,達(dá)到了簡(jiǎn)單、高效、實(shí)時(shí)的目的。在實(shí)現(xiàn)網(wǎng)絡(luò)通信時(shí),除了應(yīng)注意的問(wèn)題外,還應(yīng)了解相關(guān)的網(wǎng)絡(luò)協(xié)議以及程序在Windows平臺(tái)下工作的原理,根據(jù)應(yīng)用的具體需求,才能實(shí)現(xiàn)真正高性能的網(wǎng)絡(luò)通信。

        參考文獻(xiàn):

        [1] 陳明.實(shí)用網(wǎng)絡(luò)教程[M].北京:清華大學(xué)出版社,2006.1.

        [2] 胡志坤,秦業(yè),等.Visual C++通信工程實(shí)例精解[M].北京:機(jī)械工業(yè)出版社,2007.1

        [3] 孫小剛,韓冬,等.面向軟件工程的Visual C++網(wǎng)絡(luò)程序開(kāi)發(fā)[M].北京:清華大學(xué)出版社,2004,11.

        [4] 李峰.利用流式Socket編程實(shí)現(xiàn)Windows與Linux的通信[J].微計(jì)算機(jī)信息,2006,22:73-75.

        [5] 戴大蒙.基于非阻塞式Winsock的多線程網(wǎng)絡(luò)通信機(jī)制[J].計(jì)算機(jī)工程,2006,06:137-142.

        丰满少妇又紧又爽视频| 国产精品毛片一区二区三区| 亚洲av熟女一区二区三区站| 日韩熟女系列中文字幕| 久久国产劲爆∧v内射-百度 | 亚洲色图视频在线观看,| 五月综合丁香婷婷久久| 被灌醉的日本人妻中文字幕| 国产无夜激无码av毛片| 亚洲色婷婷一区二区三区| 国产农村乱子伦精品视频| 精品国产免费久久久久久| 欧美国产伦久久久久久久| 一区二区三区乱码专区| 丰满人妻久久中文字幕| 国产国产人免费人成免费视频 | 国产亚洲欧美在线| 亚洲视频在线视频在线视频| 高清中文字幕一区二区| 一本精品99久久精品77| 国产做无码视频在线观看浪潮| 久久国产精品老女人| 高清国产精品一区二区| 大肉大捧一进一出好爽视频动漫| 影视先锋av资源噜噜| 国产午夜精品久久久久九九| 中文资源在线一区二区三区av| 亚洲国产精品无码aaa片| 亚洲日韩精品欧美一区二区| 老熟女一区二区免费| 久久精品国产免费一区二区三区| 亚洲成在人线av品善网好看| 国产人在线成免费视频| 国产尻逼视频| 国产自产21区激情综合一区| 日韩亚洲在线观看视频| 亚洲欧洲日产国码av系列天堂| 人人妻人人澡人人爽欧美一区九九| 国产精品区一区第一页| 免费在线观看蜜桃视频| 久久精品人搡人妻人少妇|