利用 TCP/IP 实现 Windows 与 Vxworks 的通信 李峰应宏重庆三峡学院数学与计算机科学学院重庆 404000 张军中国空气动力研究与发展中心四川绵阳 621000 摘要 : 结合 TCP/IP 在某测控系统的实际应用, 讨论了在嵌入式实时操作系统 VxWorks 和 Windows 间实现网络通信的关键技术, 并给出了基本原理和开发步骤 关键词 :VxWorks; Windows; 实时操作系统 ; TCP/IP; C/S 中图分类号 :TP311.11 文献标识码 :A 基金资助 : 重庆市自然科学基金 CSTC,2005BB2001 Implementation of TCP/IP Communication Program in Windows and VxWorks Lifeng Yinghong Mathematics and Computer Science College of Chongqing Three Gorges University Zhangjun China Aerodynamics Research and Development Center [Abstract] Combining with the application of a measure and control system, the key techniques of the network communication between embedded real-time operating system VxWorks and Windows are discussed. Communication mechanism and developing process are provided. [Key words] VxWorks;Windows; RTOS;TCP/IP; C/S 1 前言 由于 TCP/IP 协议在开放性 稳定性和可靠性方面均有很大的优势, 采用 TCP/IP 协议很容易实现测控网络的体系结构 随着计算机和网络技术的发展, 采用客户 / 服务器网络模式在网络中进行数据传输成为测控领域的典型模式 而 TCP/IP 的套接字技术是实现这种客户机 / 服务器网络模式的基础, 有了这个强有力的工具, 可以实现异种机 异种操作系统应用程序间的相互连接和通信 2 开发环境 2.1 开发环境在某工业控制系统中, 采用工业控制机做上位机, 下位机是一台采用 VXI 总线的嵌入式设备 根据该控制系统的功能与性能要求, 下位机采用实时性能很高的 VxWorks 实时操作系统, 上位机采用用户比较熟悉的 Windows 操作系统 为提高开发效率, 采用 LabWindows/CVI 做为上位机的软件开发工具, 下位机则采用 VxWorks 专有的 Tornado 集成开发环境 在嵌入式实时操作系统 VxWorks 中使用 TCP 通信, 使传输速度和实时性能二者得到了很好的结合, 是 VxWorks 在实时控制系统中进行网络网络通信的最佳选择 2.2 LabWindows/CVI 程序开发环境
LabWindows/CVI 是一个用 C 语言构建仪器系统的交互式软件开发环境, 是一种开放的开发环境, 它以模块化方式对 C 语言进行编辑 编译 连接和调试 它把 C 语言的有力与柔性同虚拟仪器的软件工具库结合起来, 并提供了很多厂家生产的多达三百多种仪器的驱动程序 其重要特征就是在 Windows 平台上简化了图形用户接口的设计, 并使用户能很容易地生成各种应用程序 LabWindows/CVI 的 TCP 库函数提供了与平台无关的 面向连接的 字节流网络通信协议编程接口 为了方便用户进行网络编程,LabWindows/CVI 中封装了 TCP 类库, 可以开发基于 TCP/IP 的网络应用, 提高了开发网络应用程序的能力 2.3 VxWorks 中 Tornado 集成开发环境 VxWorks 是一个具有微内核 可裁剪的高性能强实时操作系统, 在实时操作系统市场上处于领先地位 VxWorks 是由 wrs(wind River Systems,Inc.) 公司开发的一套具有微内核 高性能 可伸缩的实时操作系统, 支持广泛的网络通信协议,wRS 公司还提供了优秀的实时操作系统开发工具 Tornado Tornado 能够支持 Windows Unix 等流行的工作平台和 PowerPC X86 ARM 等几乎所有的目标处理器, 所提供的工具可用于所有目标机 除了基本的功能和开发工具外,Tornado 还具有先进的系列网络产品, 极大地扩展了 Tornado 的网络特性, 并增强了嵌人式微处理器的网络特性 3 TCP 通信基本原理 TCP 协议即数据传输协议, 它允许创建和维护与远程计算机的连接, 使其彼此可以进行数据传输 VxWorks 支持 TCP 协议, 它提供了标准的 BSD socket 调用 socket 编程均采用用客户机 / 服务器模式, 一个完整的 socket 网络应用可以用图 1 来描述 Socket() bind() listen() accept() 阻塞监听客户连接 read() 建立连接 数据 ( 请求 ) Socket() connect() write() write() 数据 ( 回答 ) read() close() close() 服务器客户端图 1 TCP 客户 - 服务器模式的 socket 工作流程服务器首先调用 socket () 建立一个套接字 socket, 然后调用 bind() 将套接字与一个本地网络地址 (IP 地址和端口号 ) 捆绑在一起, 以保证客户端正确识别 接着服务器再调用 listen() 使套接字处于被动的准备接收状态, 同时规定它的请求队列长度 ; 随后调用 accept() 来接收客户连接, 服务器进程随即进人阻塞状态
客户与服务器的关系是不对称的 服务器先启动, 然后在某时刻客户主动发出请求, 服务器被动应答 客户端程序首先调用 socket(), 这个函数产生用于与各分系统连接的套接口, 并为每个套接口返回一个 ID 号, 然后初始化一个套接口结构体, 为其赋上该 ID 号以及服务端的 I P 地址和端口号, 并将其作为函数 connect() 的参数, 调用 connect() 函数主动去连接服务端 当服务端与客户端建立连接之后, 就可以发送 (write) 和接收 (read) 数据 4 程序设计使用 TCP 进行网络通信时每个连接包括一个服务器和客户 通常情况下, 为了使用方便, 把下位机 (VxWorks 端 ) 做为服务器, 把上位机 (Windows 端 ) 做为客户机 4.1 服务器通信程序的开发 Tornado 集成了用于 VxWorks 应用程序开发和调试的各种工具 开发者在主机系统里, 利用这个集成环境组织 编写 编译和调试应用程序, 然后下载到目标机上运行 调试 编译在主机上完成, 测试 调试需要主机目标机协调完成 在实时操作系统 VxWorks 的 Tornado 集成开发环境中用 C 语言来开发服务器通信程序的过程如下 (1) 创建套接字 创建 socket 是利用函数 socket (AF_INET,SOCK_STREAM,0), 其中 AF_INET 指定通信域为 TCP/IP 协议族,SOCK_STREAM 是全双工的字节流 socket 调用成功返回一个套接字描述符, 接着用函数 bzero((char*) &serveraddr,sa_len) 对服务器地址等数据结构初始化并对字节顺序进行初始化 (2) 绑定 函数 bind(lsnfd,(struct sockaddr *)&serveraddr,sa_len) 将套接口和端口号绑定在一起 (3) 监听 函数 listen(lsnfd,max_connection) 将在 lsnfd 套接字指定的端口上开始监听, 等待客户机的连接请求 (4) 建立连接 函数 accept(lsnfd,(struct sockaddr *) &clientaddr,&sockaddrsize)) 接收客户机的连接请求并为此建交一个连接 函数 accept 返回一个新的套接字描述符 confd 来供连接使用, 服务器则可在以前的 socket 上继续监听 (5) 发送和接收数据 函数 fioread(confd,replybuf,rlen) 用于从套接字缓冲区 replybuf 读取 Rlen 所指定字节长度的数据 函数 write (confd,replybuf,wlen) 用于向套接字缓冲区 replybuf 写 Wlen 所指定字节长度的数据 (6) 关闭连接 用函数 close(confd) 来关闭一个套接字描述符 4.2 客户机通信程序的开发 LabWindows/CVI 中封装了 TCP 类库, 可以很方便地开发基于 TCP/IP 的网络应用程序, 其开发客户机通信程序的过程如下 (1) 建立一个 TCP 连接 利用函数 ConnectToTCPServer ( ) 可以与该函数指定的远端服务器的指定端口建立一个 TCP 连接, 并指定一个 TCP 客户回调函数 客户回调函数响应连接中断事件和服务器向客户发送数据准备好事件 (2) 接收和发送数据 接收数据的程序段一般在建立连接时指定的 TCP 客户回调函数中, 接收数据函数 ClientTCPRead 用于从服务器应用程序读取数据 该函数等待直到指定的端口获取了数据或指定的时间到 发送数据用函数 ClientTCPWrite, 它将指定数据缓冲区中指定大小的数据发送出去 该
函数据等待直到数据有效或指定的时间到 (3) 终止一个 TCP 连接 DisconnectFromTCPServer 函数用来终止与服务器应用程序指定的连接, 其他连接不受影响 5 程序设计扩展上面介绍的是把下位机 (VxWorks 端 ) 做为服务器, 把上位机 (Windows 端 ) 做为客户机 反之, 把上位机 (Windows 端 ) 做为服务器, 把下位机 (VxWorks 端 ) 做为客户机也可, 基本过程类似 5.1 服务器通信程序的开发 LabWindows/CVI 开发服务器通信程序的过程如下 (1) 注册服务器 函数 RegisterTCPServer 把程序注册为 TCP 服务器并允许客户程序连接 当有客户端请求来时就与之建立一个 TCP 连接 (2) 接收和发送数据 接收数据的程序段一般在建立连接时指定的 TCP 服务器回调函数中, 接收数据函数 ServerTCPRead 用于从客户应用程序读取数据 该函数等待直到指定的端口获取了数据或指定的时间到 发送数据用函数 ServerTCPWrite, 它将指定数据缓冲区中指定大小的数据发送出去 该函数据等待直到数据有效或指定的时间到 (3) 终止一个 TCP 连接 DisconnectTCPClient 函数用来终止与服务器应用程序指定的连接, 其他连接不受影响 在实时操作系统 VxWorks 中开发服务器通信程序的过程如下 5.2 客户机通信程序的开发在实时操作系统 VxWorks 中开发客户机通信程序的过程如下 (1) 创建 socket 创建 socket 是利用函数 socket (AF_INET,SOCK_STREAM,0), 然后对服务器地址等数据结构和字节顺序进行初始化 (2) 请求连接 用函数 connect( ) 来与远端的服务器建立一个 TCP 连接请求 (3) 接收和发送数据 与服务器端读函数 fioread 不同的是, 客户端的读函数是 Read(sFd,replyBuf,Rlen), 它也是用于从套接字缓冲区 replybuf 读取 Rlen 所指定字节长度的数据 函数 write (confd, MSG,Wlen) 用于把 MSG 所指定的数据以 Wlen 所指定字节长度的数据发送出去 (4) 终止一个 TCP 连接 函数 close( ) 用来关闭一个套接字描述符 6 结束语本文描述了在 Windows 和实时操作系统 VxWorks 中利用 TCP 实现数据通信的方法, 目前已经在我们开发的某测控系统中获得了应用 该方法可适用于工业控制等多方面, 具有广泛的适应性 参考文献 : 1 李方敏编著 VxWorks 高级程序设计. 北京 : 清华大学出版社,2004.05 2 陈智育, 温彦军, 陈琪编著 VxWorks 程序开发实践. 北京 : 人民邮电出版社,2004.05 3 张毅刚, 乔立岩等编著. 虚拟仪器软件开发环境 Lab Windows/CVI6.0 编程指南. 北京 : 机械工业出版社,2002.08 4 Comer D,Stevens DL. 用 TCP/IP 进行网际互联 [M]. 北京 : 电子工业出版社,2001. 5 张军. 计算机技术在风洞现场总线中的应用研究 [D]. 成都 : 电子科技大学,2004
作者简历 : 第一作者 : 李峰 (1966-), 女, 重庆三峡学院数学与计算机科学学院, 讲师, 从事计算机软件研究与计算机教学 英文简历 : Feng Li (1966-), female, Mathematics and Computer Science College of Chongqing Three Gorges University, lecturer, engaging in studying software and teaching computer specialty. 第二作者 : 应宏 (1962-), 男, 重庆三峡学院数学与计算机科学学院, 学院首届学术带头人, 副教授, 从事分布计算技术研究 联系人 : 李峰单位 : 重庆三峡学院数学与计算机科学学院 E-Mail: myaxzh@sina.com.cn 邮编 : 404000