基于VxWorks的网络多地址通信实现方法研究
作者:李文涛
来源:《科技与创新》2015年第10期
作者:李文涛
来源:《科技与创新》2015年第10期
摘 要:简要介绍了VxWorks系统下实现网络多IP地址通信的方法,分析了网络通信技术的优势,探讨了网络UDP使用多IP地址和不同Socket端口传输技术在VxWorks系统下的具体应用,并针对相关实际应用给出了解决方法,在工程应用中具有一定的实用价值。
关键词:VxWorks;Tornado;Socket;IP地址
中图分类号:TP393.03 文献标识码:A DOI:10.15913/jki.kjycx.2015.10.110
在工程实践中,经常会用到设备之间的数据通讯,主要包括串口通信、并口通信、网络通信和1553B总线通信等。随着通讯技术的进步,网络通讯技术以价格低廉、连接方便等优势逐渐成为了各种设备接口互联的主要手段,并被广泛应用于计算机网络领域。网络通信以其开发简单、可靠性高、抗干扰性强和传输距离长等特点,被广泛应用到了互联通信、军事、航空和航天等技术领域。
1 VxWorks网络传输的特点
VxWorks是美国风河公司(WindRiver)设计开发的一种嵌入式实时操作系统,它是嵌入式开发环境的关键组成部分,而Tornado是其主机的集成开发环境。VxWorks的内核具有实时微内核的性能特点,比如快速的任务调度、中断延迟时间短、同时支持抢占式调度和时间片轮转调度。VxWorks操作系统会根据任务缓急程度设置通讯任务的优先级别,通过抢占的方式执行优先级高的任务。在工程实践过程中,经常会用到多个设备之间的通讯,这就要求工作人员设置网络收发任务,根据任务之间缓急程度的不同设置任务的优先级。VxWorks网络传输除了具有与其他操作系统相同的优势外,还具备实时性高、可靠、安全等特点。
2 VxWorks系统中网络多地址通信的实现
在Tornado中创建VxWorks工程时,先打开BSP所在目录,在CONFIG.H和CONFIGNET.H文件中声明用到的网卡名,编译生成BOOTROM文件。当VxWorks系统启动完毕后,可以在当前开发工程下的用户程序接口函数usrAppInit中或者自己开发的应用程序初始化函数中添加代码完成基本的网络配置。文中以PCPentium自带的BSP包中的Intel 8255X系列网络芯片为例,介绍同一网卡下不同IP地址、网关和子网掩码的配置方法。
ipAttach(0,"fei");
ifAddrSet("fei0","192.10.1.15");
ifMaskSet("fei0",0xffffff00);
if(InitSocket("192.10.1.15",0x2000,Handleone)== TRUE);
ifAddrAdd("fei0","165.10.1.16","165.10.1.255",0xffff0000);
if(InitSocket("165.10.1.16",0x3000,Handletwo)== TRUE);
完成网卡IP地址、网关和子网掩码配置后,要选择和建立通信端口,并确认通讯协议。选用的端口号要根据设备间的接口协议确定,在没有规定的情况下,可以选择1025~32767之间的任何一个没有被占用的端口号。
TCP与UDP协议在套接字编程中的区别是:Socket是程序间通信的方法。在建立套接字时,TCP使用Stream Sockets(流格式)的套接字,UDP使用Datagram Sock-ets(数据包格式),在程序中分别用SOCK-STREAM和SOCK-DGRAM标识。由于TCP是面向连接的,
所以,在服务器程序中,要侦听(Listen())端口,客户端设置连接(Connect()),而后在服务器端接收(Accept())。这在UDP中是不需要的,在服务器中的UDP程序中,只需要一个接收程序Recvfrom( ),而在客户端需要一个发送函数Sendto( )。那么,为什么有的UDP程序中也会出现连接函数Connect( )呢?因为Connect()函数中包含了目标地址。接下来就可以用Send()和Receive( )来代替Sendto( )和Recvfrom( )函数,而系统套接字接口会自动加上目标和源的相关信息。
总之,TCP和UDP是2种不同的网络传输层协议,是实用且可行的。用户可以根据自己不同的需要选择协议类型。
以UDP通信为例,简单介绍通信端口建立的过程:①创建套接字。利用socket()创建套接字。②给创建的套接字命名。用bind()函数将所需地址捆绑到创建的套接字上,用Setsockopt()函数设置包括Broadcast的数据,完成套接字的创建后就可以用Sendto()和Recvfrom()实现指定端口的UDP数据收发。③关闭套接字。当所有的数据操作结束后,应调用close()函数释放不用的套接字,从而停止该端口上的数据操作。
3 套接字创建程序和说明
Int InitSocket(char * localAddr,UINT localPort,int *intSocketHandle)
{/****套嵌字创建***/
struct sockaddr_in soc;
int Socket, sockAddrSize;/*变量定义*/
BOOL bl=TRUE;
socket通信为什么要指定端口 Socket = socket (AF_INET,SOCK_DGRAM, 0);/*创建套嵌字*/
if (Socket == ERROR)/*创建套嵌字失败*/
{
return FALSE;/*返回错误值*/
}
sockAddrSize = sizeof (struct sockaddr_in);
bzero ((char *)& soc, sockAddrSize);
soc.sin_len = (u_char) sockAddrSize;
soc.sin_family = AF_INET;
soc.sin_port = htons ((short)localPort);/*端口*/
soc.sin_addr.s_addr =inet_addr(localAddr);
if (bind(Socket, (SOCKADDR *)&soc,sizeof(soc)) == ERROR)
{
return FALSE;/*返回错误值*/
} if(setsockopt(Socket,SOL_SOCKET ,SO_BROADCAST,(char*)&(bl),sizeof(bl))==ERROR)
{
return FALSE;/*返回错误值*/
}
return TRUE;/*返回正确值*/
}
4 结束语
本文设计了一种基于Vxworks系统的多IP地址多端口的UDP网络通信方法,该方法已在实际设计的软件模拟器中仿真实现,并完成了大量不同数据包的收发。通过网络监视工具监测整个通信过程,无丢包和数据错误的情况发生,保证了同一网卡下多地址数据传输的稳定性。
〔编辑:白洁〕
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论