国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

TCP和UDP通信測(cè)試軟件的設(shè)計(jì)

2013-12-29 00:00:00涂金龍
電腦知識(shí)與技術(shù) 2013年4期

摘要:TCP和UDP是TCP/IP體系結(jié)構(gòu)中的兩個(gè)傳輸層協(xié)議,它們使用IP路由功能把數(shù)據(jù)包發(fā)送到目的地,從而為應(yīng)用程序及應(yīng)用層協(xié)議提供網(wǎng)絡(luò)服務(wù)。TCP與UDP各有其優(yōu)缺點(diǎn),它們之間主要的區(qū)別在于連接狀態(tài),應(yīng)用時(shí)要根據(jù)實(shí)際應(yīng)用進(jìn)行選擇。用Winsock控件編寫客戶和服務(wù)器應(yīng)用程序,不需要了解TCP/IP的具體細(xì)節(jié),通過設(shè)置Winsock控件的屬性和調(diào)用該控件的方法,可以很容易地連接到遠(yuǎn)程計(jì)算機(jī)并進(jìn)行雙向的數(shù)據(jù)交換。

關(guān)鍵詞: TCP/IP;TCP協(xié)議; UDP協(xié)議;Winsock;遠(yuǎn)程監(jiān)測(cè)

中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2013)04-0731-06

Design of TCP and UDP Communication Test Software

TU Jin-long

(Nanjing Communications Institute of Technology, Nanjing 211188, China)

Abstract: TCP and UDP are two protocols of TCP/IP transmission layer protocol. They use IP routing function to send packets to destinations, thus provide network services for applications and application layer protocols. TCP and UDP both have their advantages and disadvantages, the mai n difference between them lies in the connection state. Applications choose accord to the actual usage. Winsock can be used to write client and server applications without the need of knowing details of the TCP/IP. By setting Winsock attributes and call its control methods, connection to remote computers and two-way data exchange can be easily achieved.

Key words: TCP/IP; TCP protocol; UDP protocol; Winsock; remote monitoring

根據(jù)國家有關(guān)標(biāo)準(zhǔn),各地應(yīng)加強(qiáng)對(duì)客運(yùn)車輛燃料消耗量檢測(cè)和監(jiān)督管理,加快淘汰、更新高耗能的老舊營運(yùn)車輛。但迄今為止,我國客運(yùn)行業(yè)的能耗統(tǒng)計(jì)一直采用手工填寫統(tǒng)計(jì)報(bào)表的方式,不僅投入的人力物力大、數(shù)據(jù)誤差大,而且不能實(shí)時(shí)了解能耗情況。為此,需要研發(fā)一種客車能耗遠(yuǎn)程監(jiān)測(cè)系統(tǒng),以便實(shí)時(shí)快速地采集客車運(yùn)營過程中的有關(guān)信息,實(shí)現(xiàn)全自動(dòng)的客車能耗數(shù)據(jù)分析、處理、評(píng)估,從而改變現(xiàn)行的由人工按月或年度填寫報(bào)表的統(tǒng)計(jì)方式,提高工作效率及數(shù)據(jù)的準(zhǔn)確性,為管理部門對(duì)高能耗高污染車輛實(shí)施強(qiáng)制淘汰或報(bào)廢提供數(shù)據(jù)支持。

隨著計(jì)算機(jī)技術(shù)及網(wǎng)絡(luò)技術(shù)的不斷發(fā)展,人們的生活和工作越來越離不開網(wǎng)絡(luò),尤其是網(wǎng)絡(luò)遠(yuǎn)程控制技術(shù)已經(jīng)廣泛地應(yīng)用于網(wǎng)絡(luò)自動(dòng)化管理、實(shí)時(shí)監(jiān)控等方面。針對(duì)移動(dòng)運(yùn)行的客車,要實(shí)時(shí)獲取有關(guān)數(shù)據(jù),就需要憑借無線網(wǎng)絡(luò)將采集到的數(shù)據(jù)傳到監(jiān)控中心。在眾多的網(wǎng)絡(luò)通信中,以TCP/IP協(xié)議最為流行,為了測(cè)試遠(yuǎn)程無線通信在具有防火墻的系統(tǒng)中的有效性,針對(duì)應(yīng)用的特殊性,以及為了順利進(jìn)行軟硬件的配接,需要先編寫一個(gè)測(cè)試通信鏈路的TCP和UDP通信測(cè)試軟件。

TCP和UDP是TCP/IP體系結(jié)構(gòu)中的兩個(gè)傳輸層協(xié)議,它們使用IP路由功能把數(shù)據(jù)包發(fā)送到目的地,從而為應(yīng)用程序及應(yīng)用層協(xié)議提供網(wǎng)絡(luò)服務(wù)。TCP提供的是面向連接的可靠的端到端傳送服務(wù),它可以在低層不可靠的情況下(如出現(xiàn)分組傳輸?shù)膩G失、亂序等)提供可靠的傳輸機(jī)制。而UDP提供的是無連接的、不可靠的傳輸服務(wù),在數(shù)據(jù)傳輸之前,不需要建立連接,而且收方收到UDP數(shù)據(jù)報(bào)文之后,也不需要給出任何應(yīng)答信息。顯然,UDP減少了很多的為保證可靠傳輸而附加的額外開銷,因而它的效率高[1]。因此,TCP與UDP各有其優(yōu)缺點(diǎn),要根據(jù)實(shí)際應(yīng)用進(jìn)行選擇。

1 TCP和UDP測(cè)試軟件的設(shè)計(jì)

使用TCP和UDP通信的方法有多種,在VB開發(fā)平臺(tái)上使用Winsock控件來設(shè)計(jì)軟件可以說是最方便的。Winsock即Windows Sockets規(guī)范的簡(jiǎn)稱,是目前最流行的網(wǎng)絡(luò)通信應(yīng)用程序接口之一。Socket通常也稱作“套接字”,用于描述IP地址和端口,是一個(gè)通信鏈的句柄。應(yīng)用程序通常通過“套接字”向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求。

Winsock控件對(duì)用戶是不可見的,但它提供了訪問TCP/IP網(wǎng)絡(luò)的捷徑,使用它可以通過UDP協(xié)議或TCP協(xié)議方便地連接到遠(yuǎn)程的機(jī)器并進(jìn)行數(shù)據(jù)交換。用Winsock控件編寫客戶和服務(wù)器應(yīng)用程序,不需要了解TCP/IP或調(diào)用底層Winsock API的具體細(xì)節(jié)。通過設(shè)置Winsock控件的屬性和調(diào)用該控件的方法,可以很容易地連接到遠(yuǎn)程計(jì)算機(jī)并進(jìn)行雙向的數(shù)據(jù)交換。

使用WinSock控件時(shí),首先要確定的是使用TCP還是UDP協(xié)議,它們之間主要的區(qū)別在于連接狀態(tài)。

1.1 TCP測(cè)試軟件設(shè)計(jì)

TCP協(xié)議是面向連接的協(xié)議,在數(shù)據(jù)傳輸前就建立好了點(diǎn)到點(diǎn)的連接。TCP網(wǎng)絡(luò)程序工作原理如圖1所示[2]。

圖1 TCP網(wǎng)絡(luò)程序工作原理

基于 TCP/IP 協(xié)議網(wǎng)絡(luò)通信主要模式就是客戶機(jī)/服務(wù)器模式(Client/Server 模式,簡(jiǎn)稱 C/S),即客戶端提出請(qǐng)求,服務(wù)器在監(jiān)聽時(shí)接收到請(qǐng)求后就提供請(qǐng)求服務(wù)。遠(yuǎn)程控制是基于 C/S 模式來實(shí)現(xiàn)的,所以程序分為服務(wù)器和客戶端程序??蛻舳撕头?wù)器端連接成功后,通過信息交換取得相應(yīng)的服務(wù)。因此,在進(jìn)行編程時(shí),服務(wù)器端程序應(yīng)設(shè)置Winsock控件的LocalPort屬性和調(diào)用 Listen 方法來監(jiān)聽,客戶機(jī)端程序則要設(shè)置 Winsock 控件的 RemoteHost 和 RemotePort 屬性、調(diào)用 Connect 方法請(qǐng)求連接[3]。一旦建立了連接,兩臺(tái)計(jì)算機(jī)之間就可以發(fā)送和接受數(shù)據(jù)了。要發(fā)送數(shù)據(jù),調(diào)用SendData方法。當(dāng)接受數(shù)據(jù)時(shí),產(chǎn)生DataArrival事件。在DataArrival事件中調(diào)用GetData方法來接收數(shù)據(jù)。

在VB6開發(fā)平臺(tái)上可以方便地使用Winsock控件來設(shè)計(jì)網(wǎng)絡(luò)通信軟件,為了測(cè)試的方便,將客戶端和服務(wù)器端的軟件設(shè)計(jì)在同一軟件中,通過標(biāo)簽來選擇是客戶端還是服務(wù)器端,或是UDP測(cè)試,也可以在同一臺(tái)電腦中運(yùn)行軟件完成測(cè)試。在設(shè)計(jì)階段,添加好必要的窗體和按鈕、文本框并設(shè)置所需的名稱、屬性后,在窗體中放置Winsock控件,在屬性窗口里的協(xié)議,選擇sckTCPProtocol,也可以在代碼里配置協(xié)議,例如:

Winsock1.Protocol=sckTCPProtocol

1.1.1服務(wù)器端程序

為了能接受多個(gè)連接請(qǐng)求,需要?jiǎng)?chuàng)建新的控件實(shí)例,調(diào)用新的實(shí)例中的接受方法。下面是創(chuàng)建一個(gè)服務(wù)器端程序的主要內(nèi)容:

1)設(shè)置端口并偵聽(監(jiān)聽)。雙擊“開始偵聽”按鈕,在代碼中加入要設(shè)置的LocalPort,并開始監(jiān)聽,代碼如下:

Private Sub cmdListen_Click()

If TCP_Server(0).State <> sckClosed Then TCP_Server(0).Close

TCP_Server(0).LocalPort = txtLocalPort(2).Text

TCP_Server(0).Listen

End Sub

2)監(jiān)聽連接請(qǐng)求。監(jiān)聽方法在控件中被調(diào)用,每個(gè)連接請(qǐng)求到來時(shí),代碼會(huì)測(cè)試看它的索引(Index)是否為0(監(jiān)聽控件的值),根據(jù)其值是否為0執(zhí)行不同的操作。代碼如下:

Private Sub TCP_Server_ConnectionRequest(Index As Integer, ByVal requestID As Long)

Dim i As Long

If Index = 0 Then '主Winsock——Winsock(0)發(fā)生消息

i = 1

If maxConnext > 0 Then

While i <= maxConnext And nowconnext(i)

i = i + 1

DoEvents

Wend

End If

If i <= maxConnext Then

TCP_Server(i).LocalPort = txtLocalPort(2).Text

TCP_Server(i).Accept requestID

nowconnext(i) = True 'Winsock(i)被占用

Else

If maxConnext > 50 Then

MsgBox "已經(jīng)達(dá)到最大用戶數(shù)!", vbExclamation + vbOKOnly, "提示"

Exit Sub

End If

maxConnext = maxConnext + 1

Load TCP_Server(maxConnext)

TCP_Server(maxConnext).LocalPort = txtLocalPort(2).Text

TCP_Server(maxConnext).Accept requestID

ReDim Preserve nowconnext(maxConnext + 1)

nowconnext(maxConnext) = True

ReDim Preserve saveServerData(maxConnext + 1)

ReDim Preserve saveServerIndex(maxConnext + 1)

i = maxConnext

End If

End If

End Sub

3)服務(wù)器端發(fā)送數(shù)據(jù)。若選中發(fā)送回車符,則在代碼中增加發(fā)送回車符,若選中發(fā)送換行符,則在代碼中增加發(fā)送換行符。若是廣播,則逐個(gè)發(fā)送,否則需要選擇發(fā)送目標(biāo)。主要代碼如下:

Private Sub cmdSend3_Click()

Dim i As Integer

Dim sendresult As Long

Dim sendsrc() As Byte

Dim sendsrclen As Long

Dim sendmess(1 To 1024) As Byte

Dim outByte() As Byte

If Me.ckHex(2).Value = 1 Then '十六進(jìn)制發(fā)送

sendsrclen = Len(txtSend(2).Text) / 2 - 1

ReDim sendsrc(0 To sendsrclen)

For i = 0 To sendsrclen

sendsrc(i) = Val("&H" & Mid(txtSend(0).Text, i * 2 + 1, 2))

Next

Else

outByte = StrConv(txtSend(2).Text, vbFromUnicode)

sendsrc = outByte

sendsrclen = UBound(outByte)

End If

If chkGB.Value = 1 Then

For i = 1 To maxConnext

If TCP_Server(i).State = sckConnected Then

TCP_Server(i).SendData sendsrc

End If

DoEvents

Next

Else

Dim findSerVer As Boolean

For i = 1 To maxConnext

If saveServerIndex(i) = Val(Combo1.Text) Then

findSerVer = True

Exit For

End If

Next

If i > 0 And findSerVer = True Then

If TCP_Server(i).State = sckConnected Then

TCP_Server(i).SendData sendsrc

End If

Else

MsgBox "請(qǐng)選擇發(fā)送目標(biāo)!", , "提示:"

End If

End If

End Sub

4)服務(wù)器端接收數(shù)據(jù),數(shù)據(jù)到達(dá)后,先調(diào)用TCP_Server控件的getdata方法,將接收的數(shù)據(jù)以vbstring數(shù)據(jù)類型,存放在strdata變量之中,然后再加到txtReceive(2)控件之中。主要代碼如下:

Private Sub TCP_Server_dataarrival(Index As Integer, ByVal bytestotal As Long)

Dim strdata As String

TCP_Server(Index).GetData strdata, vbString

txtReceive(2).Text = txtReceive(2).Text & Index & ":" & TCP_Server(Index).RemoteHostIP & ":" & TCP_Server(Index).RemotePort & ":" & strdata & vbCr

End Sub

以上是創(chuàng)建一個(gè)服務(wù)器端程序的主要內(nèi)容,為了方便使用,還可適當(dāng)增加一些輔助的功能,運(yùn)行后的服務(wù)器端界面如圖2所示。

圖2 TCP協(xié)議服務(wù)器端測(cè)試軟件運(yùn)行界面

1.1.2 客戶端程序

1)設(shè)置遠(yuǎn)程主機(jī)端口并連接。雙擊“建立連接”按鈕,在代碼中指定遠(yuǎn)程主機(jī)的ip地址,并調(diào)用TCP_Client控件的connect方法,來初始化與主機(jī)的連接請(qǐng)求,代碼如下:

Private Sub cmdConnect_Click()

On Error GoTo connectErr

If Tcp_Client.State <> sckClosed Then Tcp_Client.Close

Tcp_Client.RemoteHost = txtRemoteHost(1).Text

Tcp_Client.RemotePort = txtRemotePort(1).Text

Tcp_Client.Connect

TimerConnect.Enabled = True

Exit Sub

connectErr:

StatusBar1.Panels.Item(2).Text = "未能成功連接。" & Err.Number

End Sub

2)客戶端發(fā)送數(shù)據(jù)。若選中發(fā)送回車符,則在代碼中增加發(fā)送回車符,若選中發(fā)送換行符,則在代碼中增加發(fā)送換行符。主要代碼如下:

Private Sub cmdSend2_Click()

Dim i As Integer

Dim sendresult As Long

Dim sendsrc() As Byte

Dim sendsrclen As Long

Dim sendmess(1 To 1024) As Byte

Dim outByte() As Byte

On Error Resume Next

If Me.ckHex(1).Value = 1 Then '十六進(jìn)制發(fā)送

sendsrclen = Len(txtSend(1).Text) / 2 - 1

ReDim sendsrc(0 To sendsrclen)

For i = 0 To sendsrclen

sendsrc(i) = Val("&H" & Mid(txtSend(0).Text, i * 2 + 1, 2))

Next

Else

outByte = StrConv(txtSend(1).Text, vbFromUnicode)

sendsrc = outByte

sendsrclen = UBound(outByte)

End If

If chk13(1).Value = 1 Then

sendsrclen = sendsrclen + 1

ReDim Preserve sendsrc(0 To sendsrclen)

sendsrc(sendsrclen) = 13

End If

If chk10(1).Value = 1 Then

sendsrclen = sendsrclen + 1

ReDim Preserve sendsrc(0 To sendsrclen)

sendsrc(sendsrclen) = 10

End If

If Tcp_Client.State = sckConnected Then

Tcp_Client.SendData sendsrc

Else

MsgBox "請(qǐng)先建立連接!", , "提示:"

End If

End Sub

3)客戶端接收數(shù)據(jù),先調(diào)用TCP_Client控件的getdata方法,將接收的數(shù)據(jù)以vbstring數(shù)據(jù)類型存放strdata變量之中,然后將strdata變量的內(nèi)容,加到txtReceive(1)控件之中。主要代碼如下:

Private Sub TCP_Client_dataarrival(ByVal bytestotal As Long)

Dim strdata As String

Tcp_Client.GetData strdata, vbString

txtReceive(1).Text = txtReceive(1).Text & strdata

End Sub

本部分是創(chuàng)建一個(gè)客戶端程序的主要內(nèi)容,運(yùn)行后的界面如圖3所示。

1.2 UDP測(cè)試軟件

UDP是無連接的協(xié)議。與TCP操作不同,計(jì)算機(jī)并不建立一個(gè)連接。并且,UDP應(yīng)用程序可以是用在客戶端,也可以用在服務(wù)器端。使用UDP協(xié)議,在兩個(gè)Winsock控制間進(jìn)行數(shù)據(jù)的發(fā)送,在連接的兩端必須完成以下三步:

1)設(shè)置RemoteHost屬性;

2)設(shè)置RemotePort屬性;

3)申請(qǐng)Bind方法。

通過使用方法Bind,則可將該Winsock捆綁到一個(gè)本地端口,以便該Winsock使用該端口來進(jìn)行類似TCP的“監(jiān)聽”功能,并防止其它應(yīng)用使用該端口。

使用UDP協(xié)議傳送數(shù)據(jù),首先設(shè)置客戶計(jì)算機(jī)的LocalPort屬性。而作為服務(wù)器的計(jì)算機(jī)僅需要設(shè)置RemoteHost屬性為客戶計(jì)算機(jī)的IP地址或域名,并將其RemotePort屬性設(shè)置成客戶計(jì)算機(jī)上的LocalPort屬性。主要代碼如下:

WinsockUDP.RemoteHost = txtRemoteHost(0).Text

WinsockUDP.RemotePort = txtRemotePort(0).Text

WinsockUDP.LocalPort =qlyBXq1HthfDNrQHBv2AuWgXW1nGUq2QMLljdC2OKY0= txtLocalPort(0).Text

WinsockUDP.Bind txtLocalPort(0)

然后就可通過SendData方法來開始信息發(fā)送,客戶計(jì)算機(jī)則可在其DataArrial事件中使用方法GetData來獲取發(fā)送的信息,發(fā)送和接收數(shù)據(jù)的代碼與TCP通信的代碼類似。UDP測(cè)試程序運(yùn)行后的界面如圖4所示。

圖4 UDP協(xié)議測(cè)試軟件運(yùn)行界面

2 結(jié)束語

TCP和UDP是TCP/IP體系結(jié)構(gòu)中的兩個(gè)傳輸層協(xié)議,它們使用IP路由功能把數(shù)據(jù)包發(fā)送到目的地,從而為應(yīng)用程序及應(yīng)用層

協(xié)議提供網(wǎng)絡(luò)服務(wù)。TCP提供的是面向連接的可靠的端到端傳送服務(wù),而UDP提供的是無連接的傳輸服務(wù),在數(shù)據(jù)傳輸之前,不需要建立連接,因而它的效率高。TCP與UDP各有其優(yōu)缺點(diǎn),它們之間主要的區(qū)別在于連接狀態(tài),應(yīng)用時(shí)要根據(jù)實(shí)際應(yīng)用進(jìn)行選擇。

使用TCP和UDP通信的方法有多種,在VB開發(fā)平臺(tái)上使用Winsock控件來設(shè)計(jì)軟件可以說是最方便的。用Winsock控件編寫客戶和服務(wù)器應(yīng)用程序,不需要了解TCP/IP的具體細(xì)節(jié)。通過設(shè)置Winsock控件的屬性和調(diào)用該控件的方法,可以很容易地連接到遠(yuǎn)程計(jì)算機(jī)并進(jìn)行雙向的數(shù)據(jù)交換。

參考文獻(xiàn):

[1] 天津電氣傳動(dòng)設(shè)計(jì)研究所.電氣傳動(dòng)自動(dòng)化技術(shù)手冊(cè)[M].北京:機(jī)械工業(yè)出版社,2011.

[2] 茹志鵑.基于TCP協(xié)議的Socket數(shù)據(jù)通信[J].科技信息,2012 (13):69,93

[3] 高永強(qiáng),張?zhí)靹?基于WinSock的網(wǎng)絡(luò)編程技術(shù)[J].山西大同大學(xué)學(xué)報(bào):自然科學(xué)版,2010,(5):20-23.

囊谦县| 普兰县| 东港市| 启东市| 舒兰市| 平昌县| 黄梅县| 南投县| 新邵县| 体育| 三明市| 临湘市| 梓潼县| 沁水县| 泗阳县| 竹溪县| 鲁甸县| 罗平县| 双流县| 六枝特区| 大理市| 徐闻县| 密山市| 隆尧县| 黄平县| 宝丰县| 辽阳县| 盐池县| 长乐市| 大埔区| 浙江省| 陆河县| 满洲里市| 纳雍县| 额尔古纳市| 互助| 汤原县| 吉隆县| SHOW| 东乡族自治县| 刚察县|