VxWorks网络编程

2023-05-16

vxworks实现了与BSD4.4 TCP/IP兼容的网络协议栈,并且其实时性较之有很大提高,这使得基于BSD4.4 UNIX Socket的应用程序可以很方便地移植到vxworks中去。

1.1vxworks网络组件

在最底层,vxworks通常使用以太网作为传输媒介。在传输媒介的上一层,vxworks使用TCP/IP和UDP/IP协议,用于vxworks进程与其他主机环境进程之间的传输数据。

        在以太网协议之上,提供几种网络工具:

套接字(Sockets)允许运行在vxworks或其他主机环境下的任务相互通信。

远程调用:允许一个任务唤醒实际上运行在另一台机器上的过程,调用任务和被调用过程可以是运行在vxworks或其他主机开发系统中。

远程文件访问

允许通过网络文件系统NFS、远程shell(RSH)、文件传输协议(FTP)、TFTP访问远程主机上的文件。

文件输出

允许远程主机通过NFS客户端维护vxworks dos文件系统。

远程命令执行

允许任务通过网络调用在主机开发环境上的命令。

支持以下几种物理连接:

以太网:

串行线接口协议(SLIP and CSLIP)

除了使用以太网外,vxworks网络能够使用通过串行线连接的串行线接口协议SLIP或者使用压缩头的SLIP协议(CSLIP)与主机通信。使用SLIP或CSLIP作为网络接口驱动是机器间通过长距离电话线连接或RS232串行线点对点连接使用TCP/IP软件的直接方法。

共享内存网络

vxworks网络可以用于同一个底板的多个处理器间相互通信。在这种方式下,数据的传递是通过共享内存进行的。是通过共享网络驱动程序实现的。

TCP/IP协议

TCP/IP是vxworks提供的网络间进程通信的主要机制。

主要包括三个协议:Internet协议IP协议传输层协议

1)Internet协议:处于TCP和UDP之上的一组协议专门开发的应用程序。包括telenet、文件传输协议(ftp)等

2)IP层也称网络层包括Internet协议(IP)、国际控制报文协议ICMP和地址识别协议ARP

IP协议是TCP/IP协议族的基础。该协议被设计成互连分组交换通信网,已形成一个网际通信环境。它负责在源主机和目的主机之间传输来自其较高层软件的称为数据报文的数据块,它在源和目的地之间提供非连结型传递服务。

网际控制报文协议(ICMP),实际上并不是IP层部分,但直接同IP层一起工作,报告网络上的某些出错情况。允许网际路由器传输差错信息或测试报文。

地址识别协议(ARP)实际上也不是IP层部分,它处于IP层和数据链路层之间,它是在32位IP地址和48位局域网地址之间执行翻译的协议。操作系统用地址解析协议ARP来允许机器将IP地址转变成真正的硬件地址,如以太网地址

3)传输层协议,包括传输层控制协议。主要有TCP和UDP两种协议。TCP:面向连接的传输控制协议;UDP:无连接的用户数据报协议。


IP协议是一个传输层的协议,其他协议可以用它来传输数据。传输控制协议TCP是一个可靠的端对端的协议,它用IP来传送和接收它自己的包。TCP可靠地传送和接收两应用程序间的数据,并保证数据不会丢失。当用IP来传输TCP包时,IP包的数据段就是TCP包。每一个通信主机的IP层负责传送和接收IP包。用户数据报协议(UDP)也用IP层来传输它的包。

【转载】

TCP/IP协议,涉及到四层:链路层、网络层、传输层和应用层(从下到上),对应OSI七层模型

其中以太网(Ethernet)的数据帧在链路层。

IP包在网络层,TCP或UDP包在传输层。其中的数据(Data)在应用层。

数据帧{IP包{TCP或UDP包{Data}}}

从下到上:

在链路层,以太网的物理特性决定了数据帧的长度为:(46+18)~(1500+18),其中的18是数据帧的头和尾(目标mac--6字节,源mac--6字节,类型--2字节,FCS--4字节)。即数据帧的内容最大为1500(不包括帧头和帧尾)。MTU:maximun transmission unit为1500.

网络层:IP包首部占20字节,MTU为1480;

传输层:UDP首部占8字节,MTU为1472;大于则发送方的IP层要分片传输,接收方UDP是不可靠的传输协议,如果分片丢失导致重组失败,将导致UDP数据包被丢弃。

高层协议Telnet协议,用来允许用户远程登录到另一台机器;FTP协议用来传输文件;SMTP协议用来传送email。

IP地址,32位数字。


当应用程序通过TCP/IP进行通信时,不仅要指定目标的IP地址,还要指定应用的端口地址。一个端口地址唯一地标识一个应用,标准的网络应用使用标准的端口地址。

vxworks提供操纵以太网地址的函数,例如将四点地址转换整数地址的函数,从地址中分别提取网络地址部分和主机地址部分的函数,由网络地址和主机地址生成以太网地址的函数等,详见inetLib库。

IP地址实际分为网络地址和主机地址。每部分的长度是可以变化的(有好几类IP地址)。15.32.0.19的网络地址是15.32,主机地址是0.9,主机地址又进一步分为子网地址和主机地址,子网地址是15.32.0,主机地址是15.32.0.9;

1.0.0.0到126.255.255.255为A类 主要分配给具有大量主机而局域网络数量较少的大型网络 ,默认子网掩码是0xff000000;

127.0.0.0--127.255.255.255是保留地址;

128.0.0.0到191.255.255.255为B类 一般用于国际性大公司和政府机构 ,默认子网掩码是0xffff0000;
192.0.0.0到223.255.255.255为C类 用于一般小公司 校园网 研究机构等 ,默认子网掩码是0xffffff00.

C类网络用前三组数字表示网络的地址,最后一组数字作为网络上的主机地址。前三位网络位,第四位主机位。

网络字节序

vxworks网络字节序按照大端编码。

利用宏实现提高了转换调用效率,并不受CPU体系机构的影响。

h/netinet/in.h

htonl 将一个主机长整型数据转换到网络字节顺序;

htons将一个主机短。。。。。。。。。。。。。;

ntohl将一个网络长整型数据转换到主机字节顺序;

ntohs将一个网络短整型。。。。。。。。。。。。


套接字

vxworks用户目前可以使用两种套接字,即流套接字和数据报套接字。

网络编程中最常见的是客户/服务器模式。服务端有一个任务(或多个任务)在指定的端口等待客户来连接,服务程序等待客户的连接信息,一旦连接上后,就可以按设计的数据交换方法和格式进行数据传输。


           使用socket调用后,仅产生了一个可以使用的socket描述符,这时还不能进行通信,还要使用其他的调用,以使得socket所指的结构中使用的信息被填写完。

           在使用TCP协议时,一般服务端任务先使用socket调用得到一个描述符,然后使用bind调用将一个名字与socket描述符连接起来,对于Internet域就是将Internet地址联编到socket。

           之后,服务端使用listen调用指出等待服务请求队列的长度。然后就可以使用accept调用等待客户端发起连接(一般是阻塞等待连接),一旦有客户端发出连接,accept返回客户的地址信息,并返回一个新的socket描述符,该描述符与原先的socket由相同的特性,这时服务端就可以使用这个新的socket进行读写操作。

        一般服务端可能在accept返回后创建一个新的任务进行与客户的通信,父任务则再到accept调用处等待另一个连接。

        客户端一般先使用socket调用得到一个socket描述符,然后使用connect向指定的服务器上的指定端口发起连接,一旦连接成功返回,就说明已经建立了与服务器的连接,这时就可以通过socket描述符进行读写操作了。

        使用无连接的UDP协议时,服务端任务创建一个socket,接着调用recvfrom接收客户端的数据报,然后调用sendto将要返回客户端的消息发送给客户任务。客户端也要先创建一个socket,再使用sendto向服务端任务发出请求,使用recvfrom得到返回的消息。

socket编程接口

socket系统调用

调用socket用来建立一个通信的端点,声明格式如下:

int socket(

int domain,//地址簇

int type,//数据报还是字节流

int protocal//socket protocal 一般是0

)


select调用

        select调用及宏FD_CLR、FD_ISSET、FD_SET、FD_ZERO用于同步I/O复用。

        该调用和宏定义的声明格式如下:

int selcet(

int width,//number of bits to examine from 0

fd_set *pReadFds,//read fds

fd_set *pWriteFds,//write fds

fd_set *pExceptFds,//exception fds(unsupported)

struct timeval *pTimeOut,//max time to wait ,NULL=forever

)

FD_SET(fd,&fdset)

FD_CLR(fd,&fdset)

FD_ZERO(&fdset)

         调用select用来等待一些描述符改变状态。有三个不相关的描述符集合被监测。列在参数pReadFds集合中的描述符监测是否有字符可以从某个描述符读入,列在pWriteFds集合中的描述符监测是否某个描述符准备好了可以立即写入,列在参数pExceptFds集合中的描述符检测是否某个描述符有异常出现。当该调用退出时,集合被指向状态改变的描述符。

         FD_CLR、FD_SET、FD_ZERO这三个宏用来操作集合FD_ZERO用来清空一个集合。FD_SET和FD_CLR用来从一个集合中增加或删除一个描述符。

        在select调用中,参数width是三个集合中描述符的最大值。参数pTimeOut是指出select返回的时间限制。当pTimeOut为0时,select调用立即返回。如果参数pTimeOut为空(NULL),select被阻塞。select调用成功时,返回在描述符集合中包含的描述符值,如果返回OK,表示在参数pTimeOut时间里没有描述符改变状态。当发生错误时,返回ERROR,错误发生后,集合和pTimeOut变为没有定义,所以出错后的值是无效的。

        当select调用用于socket的费阻塞connect时要注意,一般当一个socket描述符为既可读又可写的状态时,表示发生了错误,但也有可能是该连接在执行到select之前,已经变为可读。这时可以用getsocket的SO_ERROR选项,得到该socket上的错误代码。如果调用正确并且错误代码为0,表示连接正常建立了。否则当socket描述符变为可写时,表示连接正常建立。

       该调用用于I/O多路复用的情况,比如一个任务中有多个socket和终端都需要读入数据,而任务并不知道什么时候会有数据出现在哪个描述符上,这时就可以使用select。


Socket的原始方式

vxworks系统提供了socket编程原始方式的接口。在创建socket时选择类型为SOCK_RAW就能创建一个原始类型的socket,在该socket上,程序员可以自己写icmp头、tcp头等来发送原始报文。


ICMP

ICMP提供的差错报告和状态报告服务如下:

生存时间(TTL)超时;

参数不可理解;

报文不可到达;

用于流控的源队列;

Echo和Echo应答;

重定向;

时间戳和时间戳应答;

信息请求和信息请求应答;

地址掩码请求和应答。

ICMP报文是放在IP报文中的。

一个例子:

Ping使用ICMP协议的强制性ECHO-REQUEST报文来引发某个主机或网关的ICMP协议的ECHO-RESPONSE报文。通过检测返回的数据包的质量以及计算数据包所花的时间就可得出网上两个接点之间网络的通信质量。

在工作时,ping向网上发送ping数据包,并计算收发数据包所用的时间,统计数据包的丢失情况。如果有重复的数据包被接收,它就将其计入收发时间中,这样它重复地执行发包、收包、计算的过程,直到发出的数据包达到指定的数目或者被中断。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VxWorks网络编程 的相关文章

随机推荐

  • 图论的存储、遍历,Tarjan算法

    图的存储 图的存储可分为顺序存储和链式存储 顺序存储包括邻接矩阵和边集数组 xff0c 链式存储包括邻接表 链式前向星 十字链表和邻接多重表 邻接矩阵其实就是用二维数组存边 xff0c 优点是可以快速判断两节点之间是否有边 xff0c 并且
  • Visual C++ 2010 Express 下载及详细安装教程(VC2010)

    软件名称 Visual C 43 43 2010 Express 安装环境 win11 Win 10 Win 8 Win 7 安装教程 鼠标右键单击 xff0c 解压到VC 43 43 2010简体中文版 得到此文件夹 双击打开 3 找到s
  • Missing essential plugins:org.jetbrains.android Please reinstall Android Studio from scratch

    问题 在用SVN提交代码时 也不知按了什么菜单或操作 android studio竟然不动 假死罢工了 然后我直接进程结束 重新打开就会弹出下图 分析 插件文件disabled plugins txt变动导致 解决 1 打开disabled
  • LINUX笔记

    1 按条件删除 删除30分钟前的文件 find type f mmin 43 30 xargs rm f
  • Spring管理hibernateTemplate进行写入操作报只读异常

    异常描述 xff1a 此异常出现在web页面 xff0c 在后台没有报 Write operations are not allowed in read only mode FlushMode NEVER MANUAL Turn your
  • Spring 产生SessionFactory,使用c3p0配置数据源相关配置

    1 首先要引入c3p0包和支持包 xff0c 在hibernate的lib有个optional目录 xff0c 里面有需要的包 2 配置driverClass等相关属性 xff0c 注意 xff1a property里面的name值不可乱写
  • 笔记本单/双网卡如何同时上内外网

    一些公司是只有内网没有外网的 xff0c 如果要上内网的同时上外网 xff0c 比如连WiFi xff0c 如何配置 xff1f 单网卡 win 43 R 进入输入cmd 进入控制台 xff0c 输入ipconfig查看内外网的ip信息 x
  • go 实现快速排序

    一 点睛 快速排序 xff08 Quicksort xff09 是对冒泡排序的一种改进 基本思想是 xff1a 通过一趟排序将要排序的数据分割成独立的两部分 xff0c 其中一部分的所有数据都比另外一部分的所有数据都要小 xff0c 然后再
  • Chrome浏览器无法加载已解压的.crx文件的解决办法

    1 找到crx文件 xff0c 将 crx文件后缀名改为zip 并解压成文件夹 2 在扩展程序页面点击加载已解压的扩展程序 选择上面解压的文件夹 点击确定即可安装完成
  • 软件测试模型与软件测试流程5个阶段(重)

    软件测试流程 xff1a 需求分析阶段 软件设计和编码阶段 xff08 进行单元测试 xff09 集成 系统 验收测试阶段 软件测试模型 xff1a 传统 xff1a 项目计划 需求分析 软件设计 程序开发 软件测试 集成维护 V模型 xf
  • Android Studio如何卸载干净?

    想要卸载Android Studio xff1f 跟着步骤做 xff0c 还愁卸载不干净 xff1f 1 卸载前 xff0c 一定要把Android Studio退出 xff0c 接着打开 控制面板 卸载程序 Android Studio
  • 观华为模拟面试大赛有感

    1 面试注重个人收获与自我提升 xff0c 工作注重整体利益 2 遇到问题先从自身寻找问题 xff0c 努力沟通并解决 3 稳 回答问题先思考一会儿 xff0c 不要急躁 狠 xff1a 一语中的 xff0c 切中要害 xff0c 简洁有力
  • linux关于消息队列中消息的大小的限制

    在消息队列中 xff0c 例如函数msgsnd int msqid const void msgp size t msgsz int msgflg 这个函数调用的时候 xff0c msgsz最大只能为8192 xff0c 也就是2的16次方
  • MySQL事务隔离级别详解

    MySQL事务隔离级别详解 SQL标准定义了4类隔离级别 xff0c 包括了一些具体规则 xff0c 用来限定事务内外的哪些改变是可见的 xff0c 哪些是不可见的 低级别的隔离级一般支持更高的并发处理 xff0c 并拥有更低的系统开销 R
  • php 发送与接收流文件

    php 发送与接收流文件 sendStreamFile php 把文件以流的形式发送 receiveStreamFile php 接收流文件并保存到本地 sendStreamFile php lt php php 发送流文件 64 para
  • php 上传图片保存到数据库例子

    php 上传图片保存到数据库例子 php 上传图片 xff0c 一般都使用move uploaded file 方法保存在服务器上 但如果一个网站有多台服务器 xff0c 就需要把图片发布到所有的服务器上才能正常使用 xff08 使用图片服
  • 结构体最后的长度为0或1数组的作用(转载)

    其实很早在看LINUX下就看到这个东西 xff0c 后来在MFC内存池里同样也看到了类似的东西 xff0c 还依照MFC写过一个类似的小内存池 xff0c xff08 MFC用的是return this 43 1 xff09 后来在李先静的
  • chmod 755和chmod 4755的区别

    chmod 755和chmod 4755的区别 from xff1a http hi baidu com angivo blog item d679237e467f68320dd7da10 html chmod是Linux下设置文件权限的命
  • spring的依赖注入

    一 点睛 控制反转和依赖注入在Spring环境下是等同的概念 xff0c 控制反转是通过依赖注入实现的 所谓依赖注入指的是容器负责创建对象和维护对象间的依赖关系 xff0c 而不是通过对象本身负责自己的创建和解决自己的依赖 依赖注入的主要目
  • VxWorks网络编程

    vxworks实现了与BSD4 4 TCP IP兼容的网络协议栈 xff0c 并且其实时性 较之有很大提高 xff0c 这使得基于BSD4 4 UNIX Socket的应用程序可以很方便地移植到vxworks中去 1 1vxworks网络组