TCPUDP通信测试软件的设计
作者:涂金龙
来源:《电脑知识与技术》2013年第04
        摘要:TCPUDPTCP/IP体系结构中的两个传输层协议,它们使用IP路由功能把数据包发送到目的地,从而为应用程序及应用层协议提供网络服务。TCPUDP各有其优缺点,它们之间主要的区别在于连接状态,应用时要根据实际应用进行选择。用Winsock控件编写客户和服务器应用程序,不需要了解TCP/IP的具体细节,通过设置Winsock控件的属性和调用该控件的方法,可以很容易地连接到远程计算机并进行双向的数据交换。
        关键词: TCP/IPTCP协议; UDP协议;Winsock;远程监测
        中图分类号:TP393 文献标识码:A 文章编号:1009-3044201304-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协议最为流行,为了测试远程无线通信在具有防火墙的系统中的有效性,针对应用的特殊性,以及为了顺利进行软硬件的配接,需要先编写一个测试通信链路的TCPUDP通信测试软件。
        TCPUDPTCP/IP体系结构中的两个传输层协议,它们使用IP路由功能把数据包发送到目的地,从而为应用程序及应用层协议提供网络服务。TCP提供的是面向连接的可靠的端到端传送服务,它可以在低层不可靠的情况下(如出现分组传输的丢失、乱序等)提供可靠的传输机制。而UDP提供的是无连接的、不可靠的传输服务,在数据传输之前,不需要建立连接,而且收方收到UDP数据报文之后,也不需要给出任何应答信息。显然,UDP减少了很多的为保证可靠传输而附加的额外开销,因而它的效率高[1]。因此,TCPUDP各有其优缺点,要根据实际应用进行选择。
        1 TCPUDP测试软件的设计
        使用TCPUDP通信的方法有多种,在VB开发平台上使用Winsock控件来设计软件可以说是最方便的。WinsockWindows Sockets规范的简称,是目前最流行的网络通信应用程序接口之一。Socket通常也称作套接字,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过套接字向网络发出请求或者应答网络请求。
        Winsock控件对用户是不可见的,但它提供了访问TCP/IP网络的捷径,使用它可以通过UDP协议或TCP协议方便地连接到远程的机器并进行数据交换。用Winsock控件编写客户和服务器应用程序,不需要了解TCP/IP或调用底层Winsock API的具体细节。通过设置Winsock控件的属性和调用该控件的方法,可以很容易地连接到远程计算机并进行双向的数据交换。
        使用WinSock控件时,首先要确定的是使用TCP还是UDP协议,它们之间主要的区别在于连接状态。
        1.1 TCP测试软件设计
        TCP协议是面向连接的协议,在数据传输前就建立好了点到点的连接。TCP网络程序工作原理如图1所示[2]socket通信报文格式。
       
        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_Server0.State sckClosed Then TCP_Server0.Close
        TCP_Server0.LocalPort = txtLocalPort2.Text
        TCP_Server0.Listen
        End Sub
        2)监听连接请求。监听方法在控件中被调用,每个连接请求到来时,代码会测试看它的索引(Index)是否为0(监听控件的值),根据其值是否为0执行不同的操作。代码如下:
        Private Sub TCP_Server_ConnectionRequestIndex As Integer ByVal requestID As Long
        Dim i As Long
        If Index = 0 Then 'Winsock——Winsock0)发生消息
        i = 1
        If maxConnext > 0 Then
        While i
        i = i + 1
        DoEvents
        Wend
        End If
        If i
        TCP_Serveri.LocalPort = txtLocalPort2.Text
        TCP_Serveri.Accept requestID
        nowconnexti = True 'Winsocki)被占用
        Else
        If maxConnext > 50 Then
        MsgBox "已经达到最大用户数!" vbExclamation + vbOKOnly "提示"
        Exit Sub
        End If
        maxConnext = maxConnext + 1
        Load TCP_ServermaxConnext
        TCP_ServermaxConnext.LocalPort = txtLocalPort2.Text
        TCP_ServermaxConnext.Accept requestID
        ReDim Preserve nowconnextmaxConnext + 1
        nowconnextmaxConnext = True
        ReDim Preserve saveServerDatamaxConnext + 1
        ReDim Preserve saveServerIndexmaxConnext + 1
        i = maxConnext
        End If