賈志先
摘 要: 在單網(wǎng)卡情況下,實現(xiàn)Socket通信比較簡單。在雙網(wǎng)卡情況下,如何實現(xiàn)Socket通信,文獻報道尚不多見。以開發(fā)維吾爾語口語考試系統(tǒng)為例,研究了在雙網(wǎng)卡下Socket通信的算法。在維吾爾語口語考試中,通過管理機和考試機之間的Socket通信,實現(xiàn)了對考試機端登錄的控制。在管理機端具有雙網(wǎng)卡的情況下,可以充分利用網(wǎng)絡資源。實驗結(jié)果表明,所討論的雙網(wǎng)卡Socket通信的方法可行和有效。
關(guān)鍵詞: Socket通信;雙網(wǎng)卡; 考試軟件
中圖分類號:TP393.09 文獻標識碼:A 文章編號:2095-2163(2014)06-
Abstract: It is relatively simple to implement the Socket communication in a single network adapter. However, the literature about how to achieve Socket communication in dual network adapter is rarely reported. In this article, we studied the algorithm of Socket communication in dual network adapter. Take for example the development of the Uyghur oral exam system. Using Socket communication between the management terminal and the exam terminal in the Uyghur oral exam system, it actualized the control of login on exam terminal. In the Uyghur oral exam, it can take full advantage of network resources when exam management terminal has dual network adapter. Experimental results show the method is feasible and effective.
Key Words: Socket Communication; Dual Network Adapter; Test Software
0 引 言
在常用的考試軟件中,大部分是基于C/S結(jié)構(gòu),包括服務器端、管理機端和考試機端。管理機主要功能是對考試機進行控制,通常情況下,利用Socket通信來實現(xiàn)這一功能。
Socket(套接字)是網(wǎng)絡通信的基本構(gòu)件,最初是由加利福尼亞大學Berkeley學院為UNIX開發(fā)的網(wǎng)絡通信編程接口,目前已成為windows網(wǎng)絡編程事實上的標準[1-2]。在單網(wǎng)卡情況下,實現(xiàn)Socket通信比較簡單,但是,在雙網(wǎng)卡下,如何實現(xiàn)Socket通信,有關(guān)的文獻報道尚不多見。
本文將討論雙網(wǎng)卡Socket通信的實現(xiàn)算法,以及在維吾爾語口語考試系統(tǒng)中的應用。
1 雙網(wǎng)卡Socket通信實現(xiàn)算法
Socket是一組接口,是應用層與TCP/IP協(xié)議族通信的中間軟件抽象層。具體是將復雜的TCP/IP協(xié)議族隱藏在Socket接口的背后,通過Socket函數(shù)調(diào)用進行數(shù)據(jù)傳輸以符合指定的協(xié)議[1]。
Socket一般用來描述IP地址和端口,即Socket = IP地址 + 端口。其中,IP地址是主機的標識,端口是使用特定協(xié)議的某一通信進程的標識。
?Socket通信機制提供了兩種通信方式,有連接方式(TCP)與無連接方式(UDP)[1,3]。其中,TCP協(xié)議是面向連接的可靠傳輸協(xié)議,具有數(shù)據(jù)確認和數(shù)據(jù)重傳機制,保證了發(fā)送數(shù)據(jù)一定能到達通信的對方,適合于對數(shù)據(jù)完整性要求比較高的場合使用。?而UDP協(xié)議則是無連接,不可靠的傳輸協(xié)議,不具有數(shù)據(jù)確認和數(shù)據(jù)重傳機制,更適合于對數(shù)據(jù)完整性要求比較低的場合使用。
在單網(wǎng)卡下,實現(xiàn)Socket通信相對比較簡單,這里不再贅述。下面主要討論在服務器端具有雙網(wǎng)卡的情況下實現(xiàn)Socket通信的算法。在服務器端具有雙網(wǎng)卡(或多網(wǎng)卡)的情況下,服務器端和客戶端Socket通信的具體實現(xiàn)步驟可分別詳述如下。
1.1 服務器端
(1)對于服務器端的每一塊網(wǎng)卡,分別建立一個Socket,綁定(Bind)服務器端網(wǎng)卡的IP地址和端口號(這些不同Socket之間可以共用同一個端口),開始偵聽整個網(wǎng)絡中的連接請求;
(2)當檢測到來自客戶端的連接請求時,向客戶端發(fā)送收到連接請求的信息,并建立與客戶端之間的連接;
(3)根據(jù)協(xié)議,服務器端和客戶端進行數(shù)據(jù)的交互,直至一端請求關(guān)閉連接,服務器端和客戶端的Socket連接終止;
(4)返回2)等待另一客戶端的連接請求;
(5)關(guān)閉服務器端的Socket。
1.2客戶端
(1)建立客戶端的Socket;
(2)根據(jù)服務器端的主機名,獲得服務器端的所有IP地址。通過Ping確定服務器端上可連接的網(wǎng)卡的IP地址;
(3)利用服務器端的IP地址和端口,客戶端Socket發(fā)送連接(Connect)請求到服務器端,并等待服務器端的回饋信息;
(4)與服務器端連接成功后,同服務器端進行數(shù)據(jù)的交互;
(5)數(shù)據(jù)處理完畢后,關(guān)閉自身的Socket連接。
無論是服務器端程序還是客戶端程序,通信結(jié)束時,必須斷開連接并釋放所占用的資源。在服務器端具有雙網(wǎng)卡的情況下,服務器端與客戶端Socket通信流程圖[2]如圖1所示。
2 Socket通信在維吾爾語口語考試中的應用
維吾爾語口語考試采用人機對話交互的形式進行口語測試,其基本功能包括:考生登錄,設備測試,口語考試和音頻文件上傳等。硬件主要包括著服務器、管理機和考試機,軟件則主要表現(xiàn)為考試系統(tǒng)、考試管理系統(tǒng)等模塊。維吾爾語口語考試系統(tǒng)基于C/S結(jié)構(gòu),運行在管理機上的考試管理系統(tǒng)的主要功能是對考試過程進行控制,應用Socket通信實現(xiàn)管理機與考試機之間的交互。
在維吾爾語口語考試管理系統(tǒng)的界面中,“考試控制”菜單下有“允許登錄”和“禁止登錄”的選項,如圖2所示。當監(jiān)考人員在管理機上用鼠標單擊了“允許登錄”選項后,即可通過Socket通信管理機端向考試機端發(fā)送允許登錄的信息。
在維吾爾語口語考試系統(tǒng)中,應用Socket向管理機端發(fā)送連接(Connect)請求,并等待管理機端的回饋信息。系統(tǒng)中定義了一個控制用戶登錄的邏輯型變量AllowLogin,當通過Socket通信接收到考試管理系統(tǒng)發(fā)送來的允許登錄的信息后,AllowLogin變量值變?yōu)門rue,此時考生可以在考試機上登錄。同樣,當通過Socket通信接收到考試管理系統(tǒng)發(fā)送來的禁止登錄的信息后,AllowLogin變量值即變?yōu)镕alse,考生將不能在考試機上登錄。
在管理機端具有雙網(wǎng)卡的情況下,應用雙網(wǎng)卡Socket通信的技術(shù),可以充分利用網(wǎng)絡資源,提高系統(tǒng)的使用效率。
3 管理機端Socket通信
在管理機端,考試管理系統(tǒng)利用Socket通信監(jiān)聽是否有考試機端連接請求,如果有,則處理考試機端的請求,給出回應,此后繼續(xù)監(jiān)聽。管理機端上的Socket通信,需從管理機上的網(wǎng)卡信息中選取可用于Socket通信的IP地址,并綁定(Bind)管理機上網(wǎng)卡的IP地址和端口號。
3.1 獲取可用于Socket通信的IP地址
在Windows 7或Windows Server 2008中,用ipconfig命令可以查看到在計算機上存有許多的網(wǎng)卡信息和IP地址,需從這些網(wǎng)卡信息中選取可用于Socket通信的IP地址。
在Visual Studio 2010中,可使用下面的兩個類,獲取管理機端的網(wǎng)卡信息[4]:
(1)NetworkInterface類:提供訪問主機所有網(wǎng)絡接口信息的功能。利用該類可以方便地檢測到計算機上有多少個網(wǎng)卡,哪些網(wǎng)絡連接可用,并獲取每個網(wǎng)卡的型號、Mac地址等信息。在該類中封裝著本地計算機上的網(wǎng)絡接口(也稱作適配器)的數(shù)據(jù)。調(diào)用GetAllNetworkInterfaces方法將可返回一個此類的實例數(shù)組,對于本地計算機上的每個網(wǎng)絡接口,該數(shù)組中都包含一個實例。
(2)IPInterfaceProperties類:用于訪問支持 IPv4 或 IPv6 的網(wǎng)絡接口的配置和地址信息, 可檢測到所有網(wǎng)卡支持的各種IP地址。調(diào)用NetworkInterface類的GetIPProperties方法即可返回一個此類的實例。
在Visual Studio 2010中,獲取管理機端的網(wǎng)卡IP地址的算法實現(xiàn)可表述為:
(1)定義IP地址數(shù)組IPAddress()和可用網(wǎng)卡數(shù)變量AvailableIPNum;
(2)利用NetworkInterface類的GetAllNetworkInterfaces()方法,返回一個管理機端的所有網(wǎng)絡接口(NetworkInterface)實例數(shù)組;
(3)對于每一個網(wǎng)絡接口實例,判別其中的IP地址是否是以太網(wǎng)適配器本地連接的IP地址。如果是,選取其IPv4地址或IPv6地址,將IP地址保存在數(shù)組變量IPAddress中,并將可用網(wǎng)卡數(shù)變量AvailableIPNum加1。
其中,判別是否是以太網(wǎng)適配器本地連接的IP地址的條件是:在利用NetworkInterface類的GetAllNetworkInterfaces()方法建立的網(wǎng)絡接口實例中,其NetworkInterfaceType屬性等于"Ethernet",且Name屬性中不包含字符"*"(在ADSL分配的動態(tài)IP地址的網(wǎng)絡接口實例中,Name屬性中均包含有字符"*")。
對于以太網(wǎng)適配器本地連接的網(wǎng)絡接口實例,將可利用GetIPProperties()方法返回一個IPInterfaceProperties類的實例,此實例的UnicastAddresses.Item(0).Address屬性為IPv6地址,UnicastAddresses.Item(1).Address屬性為IPv4地址。
3.2 管理機端雙網(wǎng)卡Socket通信
對于管理機上的每一塊網(wǎng)卡,建立一個獨立的線程,進行Socket數(shù)據(jù)的訪問和交互操作。管理機端雙網(wǎng)卡Socket通信的部分程序流程,如圖3所示。
4 考試機端Socket通信
考試機端與管理機端Socket通信的過程是:考試機端向管理機端發(fā)送請求信息,管理機端接收并處理請求,并將回應數(shù)據(jù)發(fā)送給考試機端,考試機端讀取數(shù)據(jù),再關(guān)閉連接,一次交互結(jié)束。
與管理機端連接時,考試機端必須知道管理機端的IP地址和端口號。在管理機端具有雙網(wǎng)卡的情況下,根據(jù)管理機端的計算機名,考試機端將能獲取管理機端可連接的IP地址。
考試機端與管理機端進行連接和通信的算法實現(xiàn)過程是:
(1)定義管理端的IP地址數(shù)組mcIPAddress,網(wǎng)卡個數(shù)變量IPNum和允許登錄(邏輯型)變量AllowLogin, AllowLogin變量值的初值為False;
(2)利用管理端計算機名獲取管理端計算機的所有IP地址,區(qū)別出IPv4地址或IPv6地址,并將IP地址保存在數(shù)組變量mcIPAddress中,網(wǎng)卡個數(shù)變量IPNum加1;
(3)調(diào)用ping函數(shù),檢測出管理機端的可連接網(wǎng)卡的IP地址;
(4)使用管理機上可連接網(wǎng)卡的IP地址和端口號Port,建立與管理機端通信的Socket對象socket;
(5)通過socket向管理機端發(fā)送請求登錄信息"Request Test";
(6)若考試機端收到來自管理端發(fā)送的允許登錄信息"Permit Test",則AllowLogin變量值變?yōu)門rue,考生可以在考試機上登錄,關(guān)閉socket。否則,轉(zhuǎn)向(5),繼續(xù)通過socket向管理機端發(fā)送請求登錄信息"Request Test"。
在(2)中,通過Dns類的GetHostEntry()方法可實現(xiàn)利用管理端計算機名獲取管理端計算機的IP地址。Dns 類是一個靜態(tài)類,可從 Internet 域名系統(tǒng) (DNS) 檢索關(guān)于特定主機的信息,而利用Dns類的GetHostEntry()方法則可將主機名解析為 IPHostEntry 實例。
在(3)中調(diào)用的ping函數(shù),其功能是與管理機端進行Ping操作,確定管理機端上可連接的網(wǎng)卡的IP地址[5]。可利用System.Net.NetworkInformation命名空間中的Ping類以及其它類的方法來運行并實現(xiàn)。
Ping類的構(gòu)造函數(shù)為Ping(),用于初始化Ping類的實例。通過調(diào)用Ping類中的Send方法,即能確定是否可通過網(wǎng)絡訪問遠程計算機。
Send方法的重載有多個,其中,Send(IPAddress, Int32, Byte(), PingOptions)的功能是嘗試將包含指定數(shù)據(jù)緩沖區(qū)的Internet控制消息協(xié)議(ICMP)回送消息發(fā)送到具有指定IPAddress地址的計算機,并接收來自該計算機的相應ICMP回送答復消息。此重載允許指定操作的超時值(Int32),并控制ICMP回顯消息數(shù)據(jù)包的碎片和生存時間值。PingOptions參數(shù)用于控制如何傳輸Ping數(shù)據(jù)包。在PingOptions類中提供了Ttl和DontFragment屬性以控制如何傳輸Internet控制消息協(xié)議(ICMP)回送請求數(shù)據(jù)包。Send方法返回值為一個System.Net.NetworkInformation.PingReply類型的對象,如果收到了 ICMP 回顯回復消息,則該對象提供相應消息的相關(guān)信息;如果未收到消息,則該對象提供失敗原因。利用返回的PingReply對象的Status屬性,可獲取發(fā)送Internet控制消息協(xié)議(ICMP)回送請求并接收相應ICMP回送答復消息的嘗試的狀態(tài)。如果返回的PingReply對象的Status屬性為System.Net.NetworkInformation.IPStatus.Success,則表示Ping成功。
5 結(jié)束語
應用本文中所給出的雙網(wǎng)卡Socket通信實現(xiàn)算法,考試機端只需要知道管理機端的計算機名和端口號,就可以與管理機端連接和通信。在管理機端具有雙網(wǎng)卡的情況下,考試機端將不再需要考慮在哪一個網(wǎng)段上,以及使用管理機端哪一個網(wǎng)卡的IP地址。在維吾爾語口語考試系統(tǒng)中,通過管理機和考試機之間的Socket通信,實現(xiàn)了對考試機端登錄的控制。在管理機端具有雙網(wǎng)卡的情況下,即可獲得對網(wǎng)絡資源充分利用的理想效果。
參考文獻:
[1] 吳功宜,董大凡,王珺,等. 計算機網(wǎng)絡高級軟件編程技術(shù)[M]. 北京:清華大學出版社,2008.
[2] 劉駿,顏鋼鋒. 基于Socket的網(wǎng)絡編程技術(shù)及其實現(xiàn)[J]. 江南大學學報(自然科學版),2004,3(3):249-251.
[3] 蔣東興. Windows Sockets網(wǎng)絡程序設計大全[M]. 北京:清華大學出版社,1999.
[4] 黃嘉輝. Visual Basic.NET網(wǎng)絡程序設計:TCP/IP與Internet Programming[M]. 北京:清華大學出版社,2003.
[5] 馬駿. C#網(wǎng)絡應用編程(第2版)[M]. 北京:人民郵電出版社,2010.