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