仿真系统中的网络传输接口研究

2015-03-26 21:21姜春强
河南科技 2015年21期
关键词:网络接口端口号发送数据

姜春强

(海装重庆局,四川 成都 610000)

仿真系统中的网络传输接口研究

姜春强

(海装重庆局,四川 成都 610000)

比较大型的仿真系统需要通过多线路适配器和多协议路由器来与其他的专用网络连接获取数据。系统所需的外部数据经外部通信接口进入前端处理子系统,在对输入数据进行基本的有效性检查后,根据接入数据的不同类型,分别传送到不同的功能子系统进行处理,各个子系统处理后再送回数据库,或者直接与其他子系统发生数据交换。系统中,图象显示系统和其他的功能子系统都分别处于不同的主机上,整个系统处于一个局域网中,各个子系统的数据交换通过一个通用的网络接口来实现。

仿真系统;网络传输接口

1 网络接口的设计

TCP/IP协议簇中,传输层的协议为在不同主机上运行的进程提供通信机制,传输层协议主要包括TCP协议和UDP协议,其中TCP提供可靠的数据传输服务,在一个应用进程向另一个应用进程发送数据之前,两个进程必须为后来的数据传输参数的建立发送一些预备数据段,通常称之为TCP的“三次握手连接”;而UDP协议由于不需要在数据发送之前建立连接,采用尽力服务的方式,不用对发送速率进行管理,小量的数据报头部开销,因此它的发送效率高于TCP协议。在仿真系统中,由于对实时性要求比较高,如何使得数据发送地更快速就显得非常重要了,因此主要使用UDP来进行数据传送,只有特别重要的数据才使用TCP来传送。UDP传送效率虽然高,但提供的是不可靠的数据传送服务,传送过程中就存在掉包、数据在传送中发生错误、先发的包后到而后发的包先到、分属不同的进程的包无法区分等问题。另外在发送过程中还必须解决端口号的使用的问题,下面针对以上问题给出具体的解决方案。

1.1 提高TCP连接建立效率

在利用TCP协议进行通信时,需要事先建立好连接,这样数据发送时就不再建立连接。但是由于网络连接可能会发生意外,如果连接已经断开,则在发送时就需要重新建立连接,这样非常耗时,效率比较低。为保持连接,当网络断开时需要向发送进程和接收进程报告,然后重新建立TCP连接,这样就避免了发送数据时才进行连接,可以大大提高发送效率。在网络接口设计中可以使用一种称为“心跳”的技术,规定一个时间周期(一般是2秒),定时发送一个“心跳”包,测试连接是否断开,如果断开,则进行重新连接。

1.2 端口号的分配

在网络中,不同的主机使用主机地址来唯一确定,而进程则使用端口号来确定。一般说来,在进行数据发送时,使用一个四元组(源IP地址,源端口号,目标IP地址目标端口号)就可以唯一确定一个发送进程和其目标进程。

1.3 数据包错误检测

在网络接口中,先将用户数据按自定义的缓冲区大小进行分包(称为大包),然后每个包再按照UDP包大小进行分割(称为小包),发送的时候使用自定义的包头。

整个小包长1472个字节,其中自定义的包头占22个字节,有效数据占1450个字节。发送方在发送数据时,将用户数据拷贝到发送缓冲区中,先进行大包划分,再对每个大包进行小包划分,最后在每个自定义的包头中填入各个字段信息。

其中校验和的计算采用将各个字符的ASCII码值累加起来,这样在接收方就可以再次计算这个值,和包头中的校验和相比较判断出数据在传送过程中是否发生了错误。这种方法非常简单,效率也比较高,但是只能判断错误是否发生,不能纠正错误。

1.4 对收到的包的分类、排序和丢包的检查

在进程通信过程中,接收方需要区分分属不同进程的包、进行包的排序和丢包检查。本文采用的方法是采用数据链表方式组织接收数据包,建立一个进程数组,并为每一个不同的进程建立一个链表。还需要定义一个结构体ID,用来唯一标识某个发送进程,其字段信息包括源进程、源主机号、目的进程和目的主机号。

由于接收缓冲区和发送缓冲区都是循环使用,在对它们进行操作的时候,需要采取互斥访问的方式进行,以免发生读取时写入等问题。

1.5 套接字I/O模型的选择

比较常用的套接字I/O模型包括:blocking(阻塞)、select(选择)和completion port(完成端口)等。其中,select模型是一个应用得比较广泛的I/O模型,利用select函数实现对I/O的管理。使用select的优势是能够从单个线程的多个套接字上进行多重连接及I/O,将一个套接字分别加入到读集(readfds)、写集(writefds)和异常集(exceptfds)中,调用select函数就可以判断出这个套接字的状态,然后根据套接字的状态进行数据接收、接收连接请求等操作。而且select模型在Windows平台和UNIX平台下都能够使用。

2 网络接口的实现

网络接口实现采用C++语言来实现,其功能都封装在一个网络接口类(net_interface)中

(1)SDW ORD initNet(int Local_Proc_Type , int Group_Num =0, int BufferSize = 512000),该函数函数实现网络初始化,建立网络连接;

(2)SDWORD sendData(BYTE dest_host ,B Y TE d e s t_ proc_type, char *pdata , unsigned short datalen, unsigned short type,CHAR vip_type),实现数据发送;

(3)SDWORD readData (int BufSize, char *Buf),该函数接收数据,将收到的数据保存在一个缓冲区中;

3 网络接口的运用

网络接口非常简单,在准备进行数据传送之前,实例化一个网络接口类的对象,根据进程类型和其组号调用initNet函数,如果没有错误发生,就可以调用sendData和readData进行数据发送和接收了。

姜春强(1977.4-),男,汉,山东威海人,工程硕士,工程师,主要研究方向:电子技术和软件技术。

TP391.9

A

1003-5168(2015)11-001-01

猜你喜欢
网络接口端口号发送数据
在Docker容器中安装应用程序
一种车载自组织网络的媒体接入控制协议
带标记方式的CRDSA++协议性能分析*
双冗余网络接口自动切换测试模块的设计与实现
浅谈以java为基础的Socket通信简介及实现
使用IPSec安全传输数据
基于主控同步的CAN总线多点实时数据采集技术
浅析CTC与GSM-R系统网络接口及路由配置改进措施
网络设置管理
Winsock编程在《计算机网络基础》教学中的应用