![]() |
广嵌科技 广嵌教育 English | |
|
VxWorks嵌人式操作系统C/S模式网络编程
来源:中国电子市场 作者: 时间:2008-03-19 发布人:admin
1引言
3.1 C/S模式网络编程原理
面向连接的服务比无连接的服务处理起来要复杂。面向连接的套接字C/S模式程序的流程如图3所示。
套接字工作过程如下:服务器首先启动,通过调用socket()建立一个套接口,然后调用bind()将该套接口和本地网络地址联系在一起,再调用listen()使套接口做好侦听的准备,并规定他的请求队列的长度,之后就调用accept()来接收连接。客户在建立套接口后就可调用connect()和服务器建立连接。连接一旦建立,客户机和服务器之间就可以通过调用recv()/recvfrom()和send()/sendto()来发送和接收数据。最后,待数据传送结束后,双方调用close()关闭套接口。 3.2 编程实例 下面给出一个面向连接的点对点实时通信的工程应用的实例。该实例应用于作者所在的"网络测试分析仪"项目中。他由两部分组成,服务器在VxWorks操作系统下运行,客户机在Windows下运行。 3.2.1 服务端的程序设计 服务端的程序设计在结构上可以使用两种基本模式:循环模式和并发模式。 循环模式 服务端进程在总体上是一个循环,一次处理一个请求。在有很多客户端请求时,请求放人队列,依次等待处理。如果某个请求的处理时间过长,就会导致队列满而不能接受新的请求。 并发模式 服务端进程可以同时处理多个请求,结构上一般采用父进程接受请求,然后调用fork产生子进程,由于进程处理请求。该模式的优点是可以同时处理多个请求,客户端等待时间短。 由于是面向连接的点对点通信,所以实例中采用了循环模式。 (1)建立自己的套接口 sHost=socket(AF_INET,SOCK_STREAM,0) 该函数建立指定通信域、数据类型和协议下的套接口,通信域为AF_INET(惟一支持的格式),数据类型SOCK-STREAM表示建立流式套接口,第3个参数为0,即协议缺省。 (2)绑定本地地址 bind(sHost,(struct sockaddr * )&serverAddr,sizeof(serverAddr)) 该函数将服务器地址与sHost绑定在一起,其中,serverAddr是sockaddr_in结构,其成员描述了本地端口号和本地主机地址,经过bind()将服务器进程在网上标识出来。 (3)开始侦听 listen(sHost,2) 该函数表示连接请求队列长度为2,即允许有2个请求,若多于2个请求,则出现错误,给出错误代码WSAECONNREFUSED。 (4)等待接收连接 snew=accept(sHost,(struct sockaddr*)&clientAddr,sizeof(clientAddr))) 该函数阻塞等待请求队列中的请求,一旦有连接请求来,该函数就建立一个和sHost有相同属性的新的套接口。clientAddr也是一个sockaddr_in结构,连接建立时填入请求连接的客户端的地址。 (5)接收、发送数据 recv(snew,recvbuffer,buflen,0) recv()和send()分别负责接收和发送数据,recv()从snew(建立连接的套接口)接收数据,放人recvbuffer中,send()则将sendbuffer中数据发送给snew,第4个参数,表示该函数调用方式,通常用于诊断程序或路由选择程序,可选择MSG-DONTROUTE和MSG-OOB,MSG-WAITALL,MSG_DONTWAIT,0表示缺省。 (6)关闭套接口 close(sHost) 3.2.2 客户端程序设计 所谓客户端程序,指用来向服务端发出服务请求的程序。客户端需要知道服务端的地址、服务所提供的端口号以及服务所使用的传输层协议:TCP还是UDP。 该实例基于面向连接的TCP协议。 (1)调用WSAStartup()函数初始化WindowsSockets DLL Status = WSAStartup (VersionReqd,lpmyWSAData) (2)创建一个通信域为Internet、SOCK_STREAM类型、使用TCP协议的套接字 sClient =socket (AF_INET, SOCK_STREAM,IPPROTO_TCP) (3)设置与套接字sClient相关的属性选项 int sockopt=1 setsockopt()函数用于任意类型、任意状态套接口的设置选项值。在不同协议层上存在选项,但往往是在最高的"套接口"层次上,设置选项影响套接口的操作,诸如操作的阻塞与否、包的选径方式、带外数据的传送等。该实例中打开了SO_KEEPALIVE选项,使得套接字sClient实现在TCP连接情况下允许使用"保持活动"包。 (4)在套接字sClient上向服务器建立一个连接 connect (sClient,(struct sockaddr *)&serverAddr,sizeof(serverAddr)) 该函数让系统知道写到sClient的数据将发往何地,而且只有该地址发来的数据才被sClient接收。其中,serverAddr是sockaddr_in结构,其成员描述了服务器的地址族,提供的端口号以及服务器地址,如下, serverAddr.Sin_family=AF_INET 其中:ServerAddress和Port通过参数传人。 (5)接收、发送数据 recv (sClient,recvbuffer,buflen,0) (6)关闭套接口 Close (sClient) 4 结 语 VxWorks操作系统是目前在国内外风行的嵌入式强实时操作系统,而网络编程又是嵌入式实时系统软件的设计核心之一。本文作者介绍了基于TCP的面向连接的C/S模式的编程方法。该方法已经在NA3100网络测试仪中得到了良好而有效的应用。 ·上一条:离子迁移谱仪嵌入式系统的设计
|
相关信息 |
|||||||||||||||||||
| Copyright ©2005-2007 广东省嵌入式软件公共技术中心.All Rights Reserved.版权所有 复制必究 客户服务支持:020-32068395-832 24小时服务热线:13631411558 技术支持与报障:gdesc@midea.com.cn 020-32068395-807/809 粤ICP备05104135号 |