您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 集体工作报告2_网络仿真及Socket通信09.9.18
网络仿真要利用Tornado开发环境建立网络仿真则:必需条件:Tornado中的simulator必须是fullsimulator(可在Tornado点Help-About-Details查看,在安装Tornado的时候也能查看)。fullsimulator具有integratedsimulator所有的功能,而且还能进行网络仿真,至于安装的是哪一个simulator是由License决定的。1、安装ULIP适配器在控制面板里选择添加删除硬件-添加/排除设备故障-添加新设备-从列表选择硬件-网卡-从磁盘安装,接着选择tornado/host/x86-win32/bin下的netULIP.inf,然后确定并关闭窗口。装好之后,在ipconfig/all的输出中可看到多了一个网卡windriverulip。2、配置ULIP适配器软件环境:Tornado2.2(.1)和VxWorks5.5(.1)必需条件:Tornado中的simulator必须是fullsimulator(可在Tornado点Help-About-Details查看,在安装Tornado的时候也能查看)。fullsimulator具有integratedsimulator所有的功能,而且还能进行网络仿真,至于安装的是哪一个simulator是由License决定的。步骤:1、安装ULIP适配器在控制面板里选择添加删除硬件-添加/排除设备故障-添加新设备-从列表选择硬件-网卡-从磁盘安装,接着选择tornado/host/x86-win32/bin下的netULIP.inf,然后确定并关闭窗口。装好之后,在ipconfig/all的输出中可看到多了一个网卡windriverulip。2、配置ULIP适配器在IP栏输入192.168.255.254(可以是x.x.x.254),子网掩码设为255.255.255.0,点高级,在wins页选择禁用TCP/IP上的NETBIOS,然后确定关闭,然后可用ping192.168.255.254验证适配器是否工作正常。3、启动RoutingandRemoteAccess这个服务,并将该服务设为自动启动。4、修改tornadoargetconfigsimpcconfig.h#ifFALSE/*将原先的TRUE改成FALSE*/#undefINCLUDE_NETWORK#undefINCLUDE_NET_INIT#undefWDB_COMM_TYPE#defineWDB_COMM_TYPEWDB_COMM_PIPE#undefWDB_TTY_TEST#else/*!TRUE*/#defineINCLUDE_END#undefINCLUDE_WDB_SYS/*systemmodenotsupportedonfullsimulator*/#undefWDB_MODE#defineWDB_MODEWDB_MODE_TASK/*donotallowswitchtosystemmode*/#endif/*TRUE*/5、新建一个bootable的工程,BSP选为simpc,然后编译。如果你想检验一下网络功能,可在workspace的vxworks页的networkcomponents-networkingprotocols-networkapplications-pingclient点右键includepingclient,重新build。6、Launchsimulator,选择custom-builtsimulator,浏览选中刚才编译出来的vxworks.exe,processorno.设为0(fullsimulator可支持16个simulator,并且能够互相通信,它们的processorno.分别是0-15),确定。7、Launchtargetserver,关闭Launchsimulator后会提示你launchtargetserver,点Details,选中Fullsimulator,修改上面的命令行参数,将C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/tsfs改为系统中存在的目录,点OK启动targetserver,然后你可以双击窗口右下方的targetserver图标查看启动情况。当然你也可以通过Tornado菜单(Tools-targetserver-configure)进行targetserver的配置并启动它。8、如果Targetserver启动成功,你点launchshell启动一个shell,输入pinghost的ip,5,回车,ping通了就说明网络仿真已经成功。9、simulator与其它主机的通信:假设host0(你的主机,simulator运行于此机上)IP为10.12.9.113,host1的IP为10.12.9.129,如果host1想与simulator通讯,只需在host1的路由表中增加一项:routeadd192.168.255.110.12.9.113metric1,然后可以分别在host1上ping192.168.255.1和simulator上ping10.12.9.129进行验证。Socket通信1.套接字相关概念Vxworks系统和网络协议的接口使套接字socket,应用程序和网络协议通过该接口通信。1.1根据通信的性质分为两类:流套接字(streamsockets,采用TCP)和数据包套接字(datagramsockets采用UDP),分别用SOCK_STREAM和SOCK_DGRAM.指代流套接字和数据报套接字。SOCK_STREAM使用TCP,SOCK_DGRAM使用UDP。1.2地址和端口套接字通信的最大优点是进程间的通信完全对等。涉及3级寻址:第1级,网络级;第2级,主机级;第3级,进程级。主机和网络由32位整数表示,通信进程的标识通过16位端口号来描述。TCP和UDP各自的端口号相互独立,即TCP和UDP里相同的数字端口号是不会相互冲突的。在TCP/IP里小于256的端口号分配给标准的服务,大于256的端口号为自由端口号,当用户进行自定义的网络通信时,将以本地方式返回一个自由端口号。当进程需要访问传输层的服务时,首先向本地操作系统提出申请,操作系统将返回一个本地唯一的端口号用于标识进程,而进程通过系统调用将自己与端口绑定。1.3网络字节序。不同计算机其字节序也不同。X86是Little-Endian,PowerPC是Big-Endian。Little-Endian和Big-Endian的区别是前者在低地址存放低字节,后者在高地址存放低字节。网络通信中需要保证收发双方的字节序与TCP/IP一致。TCP/IP默认是Big-Endian。在套接字编程里,通常在发送数据到网络之前将主机端字节序转换为网络字节序,同样的,套接字从网络接收数据到主机后也应当进行相反的转换。尽管可能通信双方都与网络的字节序一致,当为了保证程序的兼容性,建议在发送前和接收后均使用字节序转换函数。网络字节序转换函数函数描述htons()HosttonetworkshortHtonl()HosttonetworklongNtohs()NetworktohostshortNtohl()Networktohostlong2.sockLib函数函数说明socket()创建套接字bind()将套接字与本地地址绑定listen()打开TCP套接字连接accept()完成套接字间连接connect()请求连接套接字shutdown()关闭套接字连接send()向TCP套接字发送数据recv()从TCP套接字接收数据select()完成同步I/O传输read()从套接字读取信息write()向套接字写入信息ioctl()完成对套接字的控制close()关闭套接字函数的使用例子:socket(AF_INET,SOCK_STREAM,0)bind(s,sockaddr*name,namelenth)listen(s,backlog)accept(s,sockaddr*addr,*addrlen)connect(s,sockaddr*name,namelenth)recv(s,*buf,buflen,flags)recvfrom(s,*buf,buflen,flags,sockaddr*from,*pfromlen)send(s,*buf,buflen,flags)sendto(s,*buf,buflen,flags,sockaddr*to,tolen)3.套接字通信流程在基于TCP/IP的套接字通信应用中,通信的两个任务通常使用cleint/serve(客户机、服务器)模式,简记为C/S模式。在C/S模式中,客户机向服务器提出请求,服务器接到请求后提供相应的服务。3.1流套接字C/S流程服务器首先调用socket()函数,建立套接字。在socket()中可以指定建立的套接字的类型,如SOCK_STREAM,表示建立的是流套接字。然后调用bind()将此套接字和本地地址绑定。接下来调用listen()函数监听,准备接收客户端的连接。当客户端发出连接请求后,服务器端得accept()函数将接收该请求并建立服务器与客户机的连接,同时返回新的套接字用来与客户端读写数据,而原套接字将继续等待并接收其他的连接。客户端也是通过socket()建立套接字。因为是面向连接的通信,因此客户端需要调用connect()函数向远方的服务器发起连接请求。服务器端得listen()函数一直在等待这样的请求,并通过accept()函数建立起双方的连接。连接建立后双方就可以通过该套接字进行读写数据的操作了。Notice:用来读写的套接字在服务器端是由accept()函数返回的,在客户端是由socket()函数建立的。图面向连接的流套接字的通信流程3.2数据报套接字C/S流程和面向连接的流式套接字不同,数据报套接字无需侦听和建立,而是直接调用sendto()或recvfrom()函数进行数据读写。具体流程如图。图面向无连接的数据报套接字通信流程4.基于流套接字的双机通信实例
本文标题:集体工作报告2_网络仿真及Socket通信09.9.18
链接地址:https://www.777doc.com/doc-2005727 .html