作者簡(jiǎn)介:蔣力(1985-),男,東莞市電子科技學(xué)校講師,碩士。研究方向:計(jì)算機(jī)網(wǎng)絡(luò)。
摘要:該文簡(jiǎn)要介紹Winsock控件的基礎(chǔ)知識(shí),使用VB編寫實(shí)現(xiàn)遠(yuǎn)程計(jì)算機(jī)通信的程序。通過程序的運(yùn)行,幫助學(xué)生學(xué)習(xí)計(jì)算機(jī)網(wǎng)絡(luò)中本機(jī)IP地址、回環(huán)地址、廣播地址以及端口號(hào)的概念。
關(guān)鍵詞:Winsock;IP地址 ;端口號(hào)
中圖分類號(hào):G712文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1005-1422(2014)06-0146-02在計(jì)算機(jī)網(wǎng)絡(luò)學(xué)習(xí)中, OSI參考模型的抽象七層結(jié)構(gòu)晦澀難懂。本校網(wǎng)絡(luò)班學(xué)生學(xué)習(xí)《計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)》之前,已有VB編程基礎(chǔ)設(shè)計(jì)做基礎(chǔ),具有一定的編程能力和理解能力。因此本文通過在Visual Basic中利用Winsock控件進(jìn)行網(wǎng)絡(luò)通訊程序的編程,使學(xué)生能夠更好地理解IP地址和端口號(hào)的概念。
一、Winsock控件基礎(chǔ)
Winsock控件在程序設(shè)計(jì)時(shí),是可見的。在程序執(zhí)行過程中,雖然隱藏在執(zhí)行的窗體之中,但是它可以為有關(guān)網(wǎng)絡(luò)通訊方面的程序設(shè)計(jì)提供依據(jù)。該控件的使用,使得調(diào)用TCP或UDP網(wǎng)絡(luò)服務(wù)極為便利。因此,在編寫有關(guān)應(yīng)用程序時(shí),只需簡(jiǎn)單了解TCP通訊協(xié)議和低級(jí)的Winsock API調(diào)用方式,學(xué)生學(xué)習(xí)時(shí)簡(jiǎn)單易懂。
1.TCP協(xié)議
TCP協(xié)議的全名為“傳輸控制協(xié)議(transfer control protocol)”,這是目前在互聯(lián)網(wǎng)上使用的主要協(xié)議,例如http,ftp,SMTP等,都是基于這個(gè)面向連接的協(xié)議。因此,當(dāng)使用TCP協(xié)議連接兩個(gè)網(wǎng)絡(luò)上的設(shè)備時(shí),將可以在它們之間交換希望交換的數(shù)據(jù)。如果正在建立主機(jī)端應(yīng)用程序時(shí),必須指定本機(jī)和本機(jī)(執(zhí)行應(yīng)用程序所在的計(jì)算機(jī))所用的連接端口號(hào),接著將Winsock控件設(shè)置為“監(jiān)聽(listen)”,即可等候遠(yuǎn)程客戶端進(jìn)行調(diào)用與連接。因此,當(dāng)主機(jī)端接收到客戶端調(diào)用并且要求連接的信息時(shí),將會(huì)觸發(fā)“要求連接()”的事件,接著進(jìn)行標(biāo)準(zhǔn)“允許”或是“拒絕”的程序。
一旦主機(jī)端與客戶端連接完成之后,將可以開始使用“傳送數(shù)據(jù)(senddata)”方法,將數(shù)據(jù)傳送給對(duì)方同時(shí),在數(shù)據(jù)傳達(dá)對(duì)方的計(jì)算機(jī)時(shí),將會(huì)觸發(fā)對(duì)方計(jì)算的“接收數(shù)(dataarrival)”事件。此時(shí),可以使用“取得數(shù)據(jù)(getdata)”方法,來去出這些接收到的數(shù)據(jù)。
2.Winsock控件
(1)該次編程中涉及的Winsock的屬性,如下:LocalHostName屬性(本地主機(jī)名稱);LocalIP屬性(本地主機(jī)IP);LocalPort屬性(本地主機(jī)端口);RemoteHost屬性(遠(yuǎn)程主機(jī)名稱);RemotePort屬性(遠(yuǎn)程主機(jī)端口);Protocol屬性(Winsock控件)(協(xié)議【TCP、UDP】);Name屬性(控件的名稱);State屬性,返回WinSock控件當(dāng)前的狀態(tài)。
(2)該次編程需用到的三個(gè)方法:Bind,SendData和GetData。
Bind 方法 ,指定用于 TCP 連接的 LocalPort 和 LocalIP。
SendData方法,當(dāng)連接建立后,要發(fā)送數(shù)據(jù)就可以調(diào)用SendData方法,該方法只有一個(gè)參數(shù),就是要發(fā)送的數(shù)據(jù)。
GetData方法,當(dāng)本地計(jì)算機(jī)接收到遠(yuǎn)程計(jì)算機(jī)的數(shù)據(jù)時(shí),數(shù)據(jù)存放在緩沖區(qū)中,要從緩沖區(qū)中取出數(shù)據(jù),可以使用GetData方法。
(3)DataArrival事件當(dāng)建立連接后,接受到了新數(shù)據(jù)就會(huì)觸發(fā)這個(gè)事件。注意:如果在接受到新數(shù)據(jù)前,緩沖區(qū)中非空,就不會(huì)觸發(fā)這個(gè)事件。
二、程序的主要設(shè)計(jì)和代碼
程序的主界面是一個(gè)窗體,包含四個(gè)文本框控件、兩個(gè)命令按鈕和一個(gè)LIST控件。四個(gè)文本框控件分別用來做監(jiān)聽的端口號(hào)、遠(yuǎn)端的IP地址和端口號(hào)、發(fā)送的內(nèi)容。兩個(gè)命令按鈕,分別做監(jiān)聽、發(fā)送命令。LIST控件用來顯示發(fā)送和接受的內(nèi)容。
1.在窗體中添加一個(gè)Winsock控件,將其Protocol屬性改為1-sckUDPprotocol。
2.將“發(fā)送”按鈕命名為command1, “監(jiān)聽”按鈕命名為command2,監(jiān)聽端口下的text文本框命名為text1,兩部電腦圖標(biāo)的Winsock控件命名為wc1,雙擊“監(jiān)聽”按鈕輸入如下程序,
If wc1.State = 1 Or wc1.State = 2 Then
wc1.Close
Command1.Enabled = False
End If
wc1.Bind CInt(Text1.Text)
Command1.Enabled = true
將“IP”右邊的文本框命名為Text3, text屬性改為你的電腦的IP, “端口”右邊的文本框命名為Text4,雙擊“發(fā)送”按鈕,“要發(fā)送的數(shù)據(jù)”下面的文本框命名為Text5,輸入如下代碼:
Dim ff As String
ff = Text4.Text
wc1.RemoteHost = Text2.Text
wc1.RemotePort = Text3.Text
wc1.SendData ff
3.雙擊兩部電腦圖標(biāo),從代碼窗口上部選擇DataArrival事件,并輸入如下代碼:
Dim kk As String
wc1.GetData kk
List1.AddItem kk + “發(fā)送者IP:” + wc1.RemoteHostIP,0
開始運(yùn)行程序。
三、Winsock程序測(cè)試
1.使用回環(huán)地址
回環(huán)地址127.0.0.1,被稱為本地回環(huán)地址(Loop back address)。它代表設(shè)備的本地虛擬接口,在windows操作系統(tǒng)中也有相似的定義,不安裝網(wǎng)卡前可以ping通本地回環(huán)地址。該程序可以用回環(huán)地址自己給自己發(fā)信息。
2.對(duì)方IP地址通信
相互之間發(fā)信息,需用端口號(hào)和IP。通過與對(duì)方通信,來幫助學(xué)生理解傳輸層中端口號(hào)的概念。案例:同學(xué)A監(jiān)聽端口號(hào)9090,同學(xué)B監(jiān)聽8080,已知A的IP地址是192.168.1.103,B的IP地址是192.168.1.102,那么A給B發(fā)信息,就需要B監(jiān)聽8080端口,A使用IP地址192.168.1.102發(fā)送信息。如果B給A發(fā)信息,就需要A監(jiān)聽9090端口,B使用IP地址192.168.1.103.
3.廣播地址通信
廣播地址是專門用于同時(shí)向網(wǎng)絡(luò)中所有工作站發(fā)送信息的地址。在使用TCP/IP 協(xié)議的網(wǎng)絡(luò)中,主機(jī)標(biāo)識(shí)段host ID 為全1 的IP 地址為廣播地址,廣播分組傳送給host ID段所涉及的所有計(jì)算機(jī)。
在實(shí)際教學(xué)中,機(jī)房IP地址段192.168.1.0/24的廣播地址為192.168.1.255,發(fā)送端口為8080,所有同學(xué)監(jiān)聽8080端口,發(fā)送的信息全部同學(xué)可以同時(shí)接收。
四、總結(jié)
通過此次實(shí)驗(yàn),不僅鍛煉了學(xué)生的VB編程能力,同時(shí)用自己編寫的程序來互相發(fā)送信息,讓學(xué)生體驗(yàn)網(wǎng)絡(luò)編程帶來的成就感.幫助學(xué)生理解計(jì)算機(jī)網(wǎng)絡(luò)中傳輸層的端口號(hào)和網(wǎng)絡(luò)層IP地址的相關(guān)概念,同時(shí)了解了計(jì)算機(jī)網(wǎng)絡(luò)中回環(huán)地址,本機(jī)地址和廣播地址的相關(guān)概念,提高了學(xué)生學(xué)習(xí)計(jì)算機(jī)網(wǎng)絡(luò)的興趣.
參考文獻(xiàn):
[1]Andrew S.Tanenbau計(jì)算機(jī)網(wǎng)絡(luò)第四版[M].北京:清華大學(xué)出版社,2005.
[2]范劍波.Visual Basic網(wǎng)絡(luò)程序設(shè)計(jì)[M].北京:科學(xué)出版社,2003.
[3]魯斌,李莉. 網(wǎng)絡(luò)程序設(shè)計(jì)與開發(fā) [M].北京:清華大學(xué)出版社,2010.
責(zé)任編輯朱守鋰