摘要:TCP和UDP是TCP/IP体系结构中的两个传输层协议,它们使用IP路由功能把数据包发送到目的地,从而为应用程序及应用层协议提供网络服务。TCP与UDP各有其优缺点,它们之间主要的区别在于连接状态,应用时要根据实际应用进行选择。用Winsock控件编写客户和服务器应用程序,不需要了解TCP/IP的具体细节,通过设置Winsock控件的属性和调用该控件的方法,可以很容易地连接到远程计算机并进行双向的数据交换。
关键词: TCP/IP;TCP协议; UDP协议;Winsock;远程监测
中图分类号:TP393 文献标识码:A 文章编号: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
根据国家有关标准,各地应加强对客运车辆燃料消耗量检测和监督管理,加快淘汰、更新高耗能的老旧营运车辆。但迄今为止,我国客运行业的能耗统计一直采用手工填写统计报表的方式,不仅投入的人力物力大、数据误差大,而且不能实时了解能耗情况。为此,需要研发一种客车能耗远程监测系统,以便实时快速地采集客车运营过程中的有关信息,实现全自动的客车能耗数据分析、处理、评估,从而改变现行的由人工按月或年度填写报表的统计方式,提高工作效率及数据的准确性,为管理部门对高能耗高污染车辆实施强制淘汰或报废提供数据支持。
随着计算机技术及网络技术的不断发展,人们的生活和工作越来越离不开网络,尤其是网络远程控制技术已经广泛地应用于网络自动化管理、实时监控等方面。针对移动运行的客车,要实时获取有关数据,就需要凭借无线网络将采集到的数据传到监控中心。在众多的网络通信中,以TCP/IP协议最为流行,为了测试远程无线通信在具有防火墙的系统中的有效性,针对应用的特殊性,以及为了顺利进行软硬件的配接,需要先编写一个测试通信链路的TCP和UDP通信测试软件。
TCP和UDP是TCP/IP体系结构中的两个传输层协议,它们使用IP路由功能把数据包发送到目的地,从而为应用程序及应用层协议提供网络服务。TCP提供的是面向连接的可靠的端到端传送服务,它可以在低层不可靠的情况下(如出现分组传输的丢失、乱序等)提供可靠的传输机制。而UDP提供的是无连接的、不可靠的传输服务,在数据传输之前,不需要建立连接,而且收方收到UDP数据报文之后,也不需要给出任何应答信息。显然,UDP减少了很多的为保证可靠传输而附加的额外开销,因而它的效率高[1]。因此,TCP与UDP各有其优缺点,要根据实际应用进行选择。
1 TCP和UDP测试软件的设计
使用TCP和UDP通信的方法有多种,在VB开发平台上使用Winsock控件来设计软件可以说是最方便的。Winsock即Windows Sockets规范的简称,是目前最流行的网络通信应用程序接口之一。Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。
Winsock控件对用户是不可见的,但它提供了访问TCP/IP网络的捷径,使用它可以通过UDP协议或TCP协议方便地连接到远程的机器并进行数据交换。用Winsock控件编写客户和服务器应用程序,不需要了解TCP/IP或调用底层Winsock API的具体细节。通过设置Winsock控件的属性和调用该控件的方法,可以很容易地连接到远程计算机并进行双向的数据交换。
使用WinSock控件时,首先要确定的是使用TCP还是UDP协议,它们之间主要的区别在于连接状态。
1.1 TCP测试软件设计
TCP协议是面向连接的协议,在数据传输前就建立好了点到点的连接。TCP网络程序工作原理如图1所示[2]。
图1 TCP网络程序工作原理
基于 TCP/IP 协议网络通信主要模式就是客户机/服务器模式(Client/Server 模式,简称 C/S),即客户端提出请求,服务器在监听时接收到请求后就提供请求服务。远程控制是基于 C/S 模式来实现的,所以程序分为服务器和客户端程序。客户端和服务器端连接成功后,通过信息交换取得相应的服务。因此,在进行编程时,服务器端程序应设置Winsock控件的LocalPort属性和调用 Listen 方法来监听,客户机端程序则要设置 Winsock 控件的 RemoteHost 和 RemotePort 属性、调用 Connect 方法请求连接[3]。一旦建立了连接,两台计算机之间就可以发送和接受数据了。要发送数据,调用SendData方法。当接受数据时,产生DataArrival事件。在DataArrival事件中调用GetData方法来接收数据。
在VB6开发平台上可以方便地使用Winsock控件来设计网络通信软件,为了测试的方便,将客户端和服务器端的软件设计在同一软件中,通过标签来选择是客户端还是服务器端,或是UDP测试,也可以在同一台电脑中运行软件完成测试。在设计阶段,添加好必要的窗体和按钮、文本框并设置所需的名称、属性后,在窗体中放置Winsock控件,在属性窗口里的协议,选择sckTCPProtocol,也可以在代码里配置协议,例如:
Winsock1.Protocol=sckTCPProtocol
1.1.1服务器端程序
为了能接受多个连接请求,需要创建新的控件实例,调用新的实例中的接受方法。下面是创建一个服务器端程序的主要内容:
1)设置端口并侦听(监听)。双击“开始侦听”按钮,在代码中加入要设置的LocalPort,并开始监听,代码如下:
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)监听连接请求。监听方法在控件中被调用,每个连接请求到来时,代码会测试看它的索引(Index)是否为0(监听控件的值),根据其值是否为0执行不同的操作。代码如下:
Private Sub TCP_Server_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Dim i As Long
If Index = 0 Then '主Winsock——Winsock(0)发生消息
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 "已经达到最大用户数!", 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)服务器端发送数据。若选中发送回车符,则在代码中增加发送回车符,若选中发送换行符,则在代码中增加发送换行符。若是广播,则逐个发送,否则需要选择发送目标。主要代码如下:
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 '十六进制发送
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 "请选择发送目标!", , "提示:"
End If
End If
End Sub
4)服务器端接收数据,数据到达后,先调用TCP_Server控件的getdata方法,将接收的数据以vbstring数据类型,存放在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
以上是创建一个服务器端程序的主要内容,为了方便使用,还可适当增加一些辅助的功能,运行后的服务器端界面如图2所示。
图2 TCP协议服务器端测试软件运行界面
1.1.2 客户端程序
1)设置远程主机端口并连接。双击“建立连接”按钮,在代码中指定远程主机的ip地址,并调用TCP_Client控件的connect方法,来初始化与主机的连接请求,代码如下:
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)客户端发送数据。若选中发送回车符,则在代码中增加发送回车符,若选中发送换行符,则在代码中增加发送换行符。主要代码如下:
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 '十六进制发送
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 "请先建立连接!", , "提示:"
End If
End Sub
3)客户端接收数据,先调用TCP_Client控件的getdata方法,将接收的数据以vbstring数据类型存放strdata变量之中,然后将strdata变量的内容,加到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
本部分是创建一个客户端程序的主要内容,运行后的界面如图3所示。
1.2 UDP测试软件
UDP是无连接的协议。与TCP操作不同,计算机并不建立一个连接。并且,UDP应用程序可以是用在客户端,也可以用在服务器端。使用UDP协议,在两个Winsock控制间进行数据的发送,在连接的两端必须完成以下三步:
1)设置RemoteHost属性;
2)设置RemotePort属性;
3)申请Bind方法。
通过使用方法Bind,则可将该Winsock捆绑到一个本地端口,以便该Winsock使用该端口来进行类似TCP的“监听”功能,并防止其它应用使用该端口。
使用UDP协议传送数据,首先设置客户计算机的LocalPort属性。而作为服务器的计算机仅需要设置RemoteHost属性为客户计算机的IP地址或域名,并将其RemotePort属性设置成客户计算机上的LocalPort属性。主要代码如下:
WinsockUDP.RemoteHost = txtRemoteHost(0).Text
WinsockUDP.RemotePort = txtRemotePort(0).Text
WinsockUDP.LocalPort =qlyBXq1HthfDNrQHBv2AuWgXW1nGUq2QMLljdC2OKY0= txtLocalPort(0).Text
WinsockUDP.Bind txtLocalPort(0)
然后就可通过SendData方法来开始信息发送,客户计算机则可在其DataArrial事件中使用方法GetData来获取发送的信息,发送和接收数据的代码与TCP通信的代码类似。UDP测试程序运行后的界面如图4所示。
图4 UDP协议测试软件运行界面
2 结束语
TCP和UDP是TCP/IP体系结构中的两个传输层协议,它们使用IP路由功能把数据包发送到目的地,从而为应用程序及应用层
协议提供网络服务。TCP提供的是面向连接的可靠的端到端传送服务,而UDP提供的是无连接的传输服务,在数据传输之前,不需要建立连接,因而它的效率高。TCP与UDP各有其优缺点,它们之间主要的区别在于连接状态,应用时要根据实际应用进行选择。
使用TCP和UDP通信的方法有多种,在VB开发平台上使用Winsock控件来设计软件可以说是最方便的。用Winsock控件编写客户和服务器应用程序,不需要了解TCP/IP的具体细节。通过设置Winsock控件的属性和调用该控件的方法,可以很容易地连接到远程计算机并进行双向的数据交换。
参考文献:
[1] 天津电气传动设计研究所.电气传动自动化技术手册[M].北京:机械工业出版社,2011.
[2] 茹志鹃.基于TCP协议的Socket数据通信[J].科技信息,2012 (13):69,93
[3] 高永强,张天刚.基于WinSock的网络编程技术[J].山西大同大学学报:自然科学版,2010,(5):20-23.