51OpenlabMininet入门

文章目录

  • `51Openlab`上`Mininet`入门
    • 一、`Mininet`简介
    • 二、安装`Mininet`
      • 1. 安装完成后的测试
    • 三、拓扑构建和命令使用
      • 1. 一些命令:
        • (1)网络构建
        • (2)选项
      • 2. 创建拓扑实操
        • (1)单一拓扑
        • (2)线性拓扑
        • (3)树形拓扑
        • (4)`py`脚本创建
      • 3. 内部交互命令使用
      • 4. `Mininet`可视化构建网络拓扑
        • (1)基本操作
        • (2)保存脚本
    • 四、`Mininet`调用`API`扩展自定义拓扑
      • 1. 函数使用
        • (1)在`Mininet`交互环境中添加主机`h3`
        • (2)在`Mininet`交互环境中添加`s3`与主机`h3`之间的链路。
        • (3)在`Mininet`交互环境中添加接口
        • (4)在`Mininet`交互环境中对主机进行配置`IP`地址
        • (5)查看节点信息
        • (6)测试
    • 五、`Mininet`可视化构建网络拓扑
    • 六、`Mininet`流表应用实战1——手动添加流表
      • 1. 测试无流表状态下主机间的通信
      • 2. 添加流表并测试主机间的通信
      • 3. 添加协议流表使`h1/h2`通信
    • 七、`Mininet`流表应用实战2——控制器下发流表协议分析
    • 八、 `Mininet`多数据中心网络拓扑流量带宽实验

都是来自51Openlab上的资料,因为要做有关的毕设,所以需要学习一下。
大多是复制的,但是其中也有我的一些理解和实验的截图
51Openlab

一、Mininet简介

Mininet是一个可以在有限资源的普通电脑上快速建立大规模SDN原型系统的网络仿真工具。该系统由虚拟的终端节点(End-Host)、OpenFlow交换机、控制器(也支持远程控制器)组成,这使得它可以模拟真实网络,可对各种设想或网络协议等进行开发验证。目前Mininet已经作为官方的演示平台对各个版本的OpenFlow协议进行演示和测试。

Mininet是基于Linux Container这一内核虚拟化技术开发出的虚拟化平台,其实现虚拟化主要是用到了Linux内核的Network namespace资源隔离机制。LinuxNetwork namespace机制可以让每个namespace拥有独立的网络设备、网络协议栈和端口等。Mininet正是利用了Linux这种Network namespace机制,才可以在一台电脑上创建多台虚拟主机。此外,Mininet建立的网络拓扑的交换节点可以是Open vSwitch、Linux Bridge等软件交换机,交换节点之间的链路采用Linuxveth pair(virtual Ethernet pair)机制实现,控制器可以部署在网络可达的任意地方。因此,Mininet可以定制任意灵活的SDN网络拓扑,为实验用户提供快捷可靠的实验环境。

Mininet架构按datapath的运行权限不同,分为kernel datapathuserspace datapath两种,其中kernel datapath把分组转发的逻辑编译进入Linux内核,效率非常高;userspace datapath把分组转发逻辑实现为一个应用程序,叫做ofdatapath,效率虽不及kernel datapath,但更为灵活,更容易重新编译。

Mininetkernel datapath架构如下图所示,控制器和交换机的网络接口都在root 命名空间中,每个主机都在自己独立的命名空间里,这也就表明每个主机在自己的命名空间中都会有自己独立的虚拟网卡eth0。控制器就是一个用户进程,它会在loopback上预留的6633端口监听来自交换机安全信道的连接。每个交换机对应几个网络接口,比如``s0-eth0、s0-eth1以及一个ofprotocol`进程,它负责管理和维护同一控制器之间的安全信道。

Mininetuserspace datapath架构如下图所示,与kernel datapath架构不同,网络的每个节点都拥有自己独立的namespace。因为分组转发逻辑是实现在用户空间,所以多出了一个进程叫ofdatapath。另外,Mininet除了支持kernel datapathuserspace datapath这两种架构以外,还支持OVS交换机。OVS充分利用内核的高效处理能力,它的性能和kernel datapath相差无几。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HxrG8qxN-1647761749137)(https://www.51openlab.com/site_media/media/course/bc49a3e27fa84c79835ad893864250cf/3/49cd355a-c740-4a42-8b3a-4ab72a163287)]

二、安装Mininet

之前我在自己的虚拟机上安装过Mininet,具体可以去看

  • Ubuntu的安装和基础设置
  • Ubuntu解决python和pip安装升级
  • Ubuntu安装Mininet

按着51Openlab的实验指导书安装,再执行./install.sh -a前先更新一下软件:apt-get update

1. 安装完成后的测试

mn --test pingall


三、拓扑构建和命令使用

Mininet能实现如下功能:

  • OpenFlow应用程序提供一个简单、便宜的网络测试平台
  • 启用复杂的拓扑测试,无需连接物理网络
  • 具有拓扑感知和OpenFlow感知的CLI,用于调试或运行网络范围的测试
  • 支持任意自定义拓扑,主机数可达4096,并包括一组基本的参数化拓扑
  • 提供用于网络创建和实验的可扩展Python API

在基于Mininet的使用下,可以轻易的在自己的笔记本上测试一个软件定义网络(software-defined Networks),对基于OpenFlowOpen vSwitch的各种协议等进行开发验证,或者验证自己的想法。且所有的代码几乎可以无缝迁移到真实的硬件环境中,在实验室里,一行命令就可以创建一个支持SDN的任意拓扑的网络结构,并可以灵活的进行相关测试,验证了设计的正确后,可以轻松部署到真实的硬件环境中。

MininetEdit可视化界面:Mininet 2.2.0+内置miniedit 。在mininet/examples下提供miniedit.py脚本,执行脚本后显示可视化界面,可自定义拓扑及配置属性。

1. 一些命令:

(1)网络构建

  • topo:用于指定网络拓扑,Mininet支持创建的网络拓扑为:minimalsinglelineartree

  • minimal:创建一个交换机和两个主机相连的简单拓扑。默认无—topo参数的情况下就是这样。其内部实现就是调用了single,2对应的函数。

  • single,n:设置一个交换机和n个主机相连的拓扑。

  • linear,n:创建n个交换机,每个交换机只连接一个主机,并且所有交换机成线型排列。

  • tree,depth=n,fanout=m:创建深度为n,每层树枝为m的树型拓扑。因此形成的拓扑的交换机个数为(mn-1)/(m-1),主机个数为mn

  • —custom:在上述已有拓扑的基础上,Mininet支持自定义的拓扑,使用一个简单的Python API即可。—custom需和—topo一起使用,如mn —custom file.py —topo mytopo

(2)选项

Mininet常用命令总结:

命令 作用
help 默认列出所有命令文档,后面加命令名将介绍该命令用法 dump打印节点信息
gterm 给定节点上开启gnome-terminal 注:可能导致mn崩溃
xterm 给定节点上开启xterm
intfs 列出所有的网络接口
iperf 两个节点之间进行简单的iPerf TCP测试
iperfudp 两个节点之间用制定带宽UDP进行测试
net 显示网络链接情况
noecho 运行交互式窗口,关闭回应(echoing)
pingpair 在前两个主机之间互Ping测试
source 从外部文件中读入命令
dpctl 在所有交换机上用dptcl执行相关命令,本地为tcp 127.0.0.1:6634
link 禁用或启用两个节点之间的链路
nodes 列出所有的节点信息
pingall 所有主机节点之间互Ping
py 执行Python表达式
sh 运行外部shell命令
quit/exit 退出

2. 创建拓扑实操

(1)单一拓扑
sudo mn --topo=single,3

单一(Single)拓扑指整个网络拓扑中交换机有且只有一个,交换机可以下挂一个或多个主机,本例创建了一个交换机、3个主机,3个主机都下挂在一个交换机下。

(2)线性拓扑
sudo mn --topo=linear,3

线性(linear)拓扑指交换机连接呈线形排列,且每个交换机所连接主机数目只有一个,本例创建了3个交换机、3个主机,3个主机分别下挂在一个交换机下。

(3)树形拓扑
sudo mn --topo=tree,depth=2,fanout=2

树形(tree)拓扑指交换机连接成树形排列,且每个交换机所连接主机一般有多个关联使用参数depthfanout,本例创建了depth2fanout2的拓扑,表示交换机深度即层数为2,每个交换机下挂2个设备。

树形结构创建需要用到fanoutdepth两个属性,fanout 称为扇出,depth 称为深度,扇出决定每层分支设备节点数,深度为主机到根 openflow 交换机经历的层级数,树形结构总共有台n(fanout)m(depth) 次幂个主机。如2 扇出 2层树形结构包含 4台主机,

(4)py脚本创建

使用py脚本创建拓扑

cd /home/openlab/openlab/mininet/custom
sudo mn --custom topo-2sw-2host.py --topo mytopo

custom目录下存在topo-2sw-2host.py文件,本例调用此文件构建拓扑

3. 内部交互命令使用

  • net:显示链接信息

  • nodes:查看节点信息

  • links:查看链路健壮性信息

  • pingall:验证所有主机间通信并查看结果

  • xterm h1 h2开启xterm进入设备可视化操作界面

  • mn -c:清除释放Mininet构造配置的交换机及主机

4. Mininet可视化构建网络拓扑

在目录:/home/openlab/openlab/mininet/examples中执行sudo ./miniedit.py

cd /home/openlab/openlab/mininet/examples
sudo ./miniedit.py

(1)基本操作

单个设备配置:在设备上长按鼠标右键,选择Properties即可配置

Miniedit左上角“Edit”中可以剪切删除设备,及对整个网络进行全局配置:

点击左下角的run,即可运行

对设备长按右键可以查看设备配置终端和设置配置

(2)保存脚本

可视化搭建后,可以保存为py脚本

保存的目录是在:mininet/example目录下,通过chmod给此脚本权限后,直接运行即可重现拓扑。

通过后台查看保存的``sdnlab.py脚本文件,并给脚本赋予权限:chmod –R 777 sdnlab.py执行sdnlab.py脚本:./sdnlab.py`


四、Mininet调用API扩展自定义拓扑

Mininet作为一个基于Python的网络仿真工具,可以分为两大部分:Python库和运行文件。前者对网络中元素进行抽象和实现,例如定义主机类来表示网络中的一台主机;后者则基于这些库完成模拟过程。

  • addHost(“host name”): 添加主机
  • addSwitch(“sw name”): 添加交换机
  • addLink(node,node): 添加链路
  • attach(port):添加端口

1. 函数使用

进入:cd /home/openlab/openlab/mininet/custom

创建拓扑:sudo mn --custom topo-2sw-2host.py --topo mytopo

(1)在Mininet交互环境中添加主机h3

py net,addHost('h3')

(2)在Mininet交互环境中添加s3与主机h3之间的链路。

py net.addLink(s3,net.get('h3'))

(3)在Mininet交互环境中添加接口

py s3.attach('s3-eth3')

(4)在Mininet交互环境中对主机进行配置IP地址

py net.get('h3').cmd('ifconfig h3-eth0 10.3')

(5)查看节点信息

dump
nodes

(6)测试

h1 ping h3

pingall


五、Mininet可视化构建网络拓扑

开启MiniEdit

cd /home/openlab/openlab/mininet/mininet/examples
sudo ./miniedit.py

和前面的差不多,写一下这一点:

  • 交换机的设置:配置16位的DPID,勾选enable netflow、enable sFlow
  • 选择链路,也可以配置信息:

  • Edit中勾选配置:


六、Mininet流表应用实战1——手动添加流表

SDN环境下,当交换机收到一个数据包并且交换机中没有与该数据包匹配的流表项,且交换机未被SDN控制器控制,交换机将此数据包丢弃。可以通过对流表操作来控制交换机的转发行为,通过手动对交换机下发流表,当交换机交换机收到一个数据包时,因已手工添加相对应的流表,交换机根据流表操作转发数据包,使主机间通信。

进入目录:cd /home/openlab/openlab/mininet/custom

编写拓扑脚本:sudo vim exper1.py

#!/usr/bin/python
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import RemoteController
from mininet.link import TCLink
from mininet.util import dumpNodeConnections
class MyTopo( Topo ):"Simple topology example."def __init__( self ):"Create custom topo."# Initialize topologyTopo.__init__( self )# Add hosts and switchesHost1 = self.addHost( 'h1' )Host2 = self.addHost( 'h2' )Host3 = self.addHost( 'h3' )Switch1 = self.addSwitch( 's1' )Switch2 = self.addSwitch( 's2' )# Add linksself.addLink( Host1, Switch1 )self.addLink( Host2, Switch1 )self.addLink( Host3, Switch2 )self.addLink( Switch1, Switch2 )
topos = { 'mytopo': ( lambda: MyTopo() ) }

保存退出::wq

执行如下命令运行自定义脚本,并远程指定一个不存在的控制器,使交换机不受控制器控制。

sudo mn --custom exper1.py --topo mytopo --controller=remote,ip=127.0.0.1,port=6653

生成拓扑如下:

1. 测试无流表状态下主机间的通信

xterm h1 h2 h3

查看交换机当前的flow table

没有流表

h2和``h3`上开启网卡抓包:

tcpdump -n -i h2-eth0
tcpdump -n -i h3-eth0

h1pingh2h3

ping -c 3 10.0.0.2
ping -c 3 10.0.0.3

可以看到主机h1 Ping h2h3失败了,主机h2h3上没有收到任何ICMP echo request packet。原理解析:ping操作时,由于拓扑里没有SDN控制器,也没有用dptclOpenFlow交换机添加任何flow entry,所以交换机不会做转发决定,并直接丢弃h1h2h1h3ping

2. 添加流表并测试主机间的通信

执行如下命令添加交换机端口流表使主机h1和h2通信

dpctl add-flow in_port=1,actions=output:2
dpctl add-flow in_port=2,actions=output:1

查看流表:dpctl dump-flows

进行ping测试,

h1 ping h2和h3

ping -c 3 10.0.0.2
ping -c 3 10.0.0.3

结果:

可以看到主机h1成功pingh2,且h3没收到任何ping包。原理解析:用dpctl对交换机添加flow,让交换机从s1-eth1这个端口接收到的所有traffic都从s1-eth2这个端口发出去。用dpctl给交换机添加双向流表,因为ping包除了echo request还有echo reply。所以还需要用dpctl对交换机添加flow,让交换机从s1-eth2这个端口接收到的所有traffic都从s1-eth1这个端口发出去。添加这两条flow后,h1能够pingh2,但是并没有为h1h3之间添加对应的端口流表,所以h1h3不通。

3. 添加协议流表使h1/h2通信

删除之前添加的流表:dpctl del-flowsdpctl dump-flows

添加两条traffic类型为IPv4(0x0800)协议相关的flow entry

dpctl add-flow dl_type=0x0800,nw_dst=10.0.0.2,actions=output:2
dpctl add-flow dl_type=0x0800,nw_dst=10.0.0.1,actions=output:1
dpctl dump-flows

**结果:**测试pingh1 ping 不通 h2和h3

分析:

原理解析:用dpctl对交换机添加flow,让交换机把所有EtherType0x0800(IPv4)并且destiation IP10.0.0.2traffics1-eth2这个端口发出去。用dpctl对交换机添加flow,让交换机把所有EtherType0x0800(IPv4)并且destiation IP10.0.0.1traffics1-eth1这个端口发出去。但处在同一网段下的主机,它们之间的交流是L2 forwarding,需要靠ARP来解析MAC地址,之前只匹配了0x0800(IPv4)协议,并没有匹配到0x0806(ARP),这样当交换机收到h1ARP包后,因为没有控制器,flow table里面也没有相应的flow告诉它如何转发这个ARP包,交换机只能将它丢弃,从而导致h1 ping h2失败,所以需要添加ARP协议的流表来使通信。

解决:

执行命令dpctl add-flow dl_type=0x0806,actions=NORMAL添加ARP(0x0806)协议相关的流表,让交换机以NORMAL形式(即广播)将所有ARP包从各个端口广播出去

ping测试:

h1 可以ping通 h2


七、Mininet流表应用实战2——控制器下发流表协议分析

  • 理解OpenFlow交换机和控制器间的工作原理。
  • 学会使用Wireshark抓包分析,熟悉了解OpenFlow协议

实验拓扑:

SDN环境下,当交换机收到一个数据包并且交换机中没有与该数据包匹配的流表项时,交换机将此数据包发送给控制器,由控制器决策数据包如何处理。控制器下发决策后,交换机根据控制器下发的信息来进行数据包的处理,即转发或者丢弃该数据包。

在控制器上查看端口使用情况:

netstat -an|grep 6653
netstat -an|grep 8181

查看IP地址

Mininet虚拟机上开启wireshark

进行Wireshark抓包,监听网卡any上的数据流量。

进入/home/openlab/openlab/mininet/custom

目录下,编写拓扑脚本:

#!/usr/bin/python
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import RemoteController
from mininet.link import TCLink
from mininet.util import dumpNodeConnections
class MyTopo( Topo ):"Simple topology example."def __init__( self ):"Create custom topo."# Initialize topologyTopo.__init__( self )# Add hosts and switchesHost1 = self.addHost( 'h1' )Host2 = self.addHost( 'h2' )Host3 = self.addHost( 'h3' )Switch1 = self.addSwitch( 's1' )Switch2 = self.addSwitch( 's2' )# Add linksself.addLink( Host1, Switch1 )self.addLink( Host2, Switch1 )self.addLink( Host3, Switch2 )self.addLink( Switch1, Switch2 )
topos = { 'mytopo': ( lambda: MyTopo() ) }

执行脚本建立拓扑:

sudo mn --custom exper1.py --topo mytopo --controller=remote,ip=30.0.1.197,port=6653

这里的ip地址填写刚才查询的控制器的IP地址,验证连通性:

pingall

创建的拓扑如下:

查看交换机上的流表:

dpctl dump-flows

停止Wireshark抓包并查看抓包结果,筛选openflow_v1协议数据包

登录ODL控制器,打开浏览器并输入URL地址:

分析协议:

首先发送HELLO消息,建立初始化连接,协商使用的OpenFlow协议版本。由下图可知,ODLMininet之间应用的是OpenFlow1.0版本协议

OpenFlow版本协商完成后,控制器发送一条features_request消息获取交换机的特性信息,包括交换机的ID(DPID)、缓冲区数量、端口及端口属性等等。相应的,交换机回复features_reply消息。

ofpt_feature_reply数据包详情如下,交换机的DPID是数据通道独一无二的标识符。本实验中交换机缓冲区数量(n_buffers)256,交换机支持的流表数量(n_tables)254,交换机所支持的功能,

stats reply消息用于回应stats request信息,主要是交换机回应给控制器的状态信息。

当交换机收到数据包后查找流表无匹配项时,将数据包封装在packet_in消息发给控制器,由控制器通过packet_out消息下发决策,使发送和接收数据包的两主机间进行通信

flow mod消息涉及流表项的下发匹配信息,下图显示的是flow mod匹配项的类型信息。

八、 Mininet多数据中心网络拓扑流量带宽实验

1、掌握多数据中心网络拓扑的构建。
2、熟悉网络性能测试工具Iperf,根据实验测试SDN网络的性能。

实验原理:

使用mininet中的iperf工具在网络中生成UDP流量,iperf客户端传送数据流到iperf的服务端,由服务端接收并记录相关信息。网络性能评估中一个巨大的挑战就是如何生成真实的网络流量,可以通过程序来创造人工的网络流量,通过建立测试环境来模拟真实的状况。此应用主要以数据中心网络为目标场景,在mininet仿真环境中尽可能地还原数据中心内部的真实流量情况。

Mininet数据中心应用价值:

  • 树状拓扑结构容错能力强
  • 降低数据中心成本消耗
  • 提供重新排列的全带宽无阻碍路径
  • 提高带宽利用率
  • 分析数据中心网络流量性能
  • 为真实数据中心和仿真测试床提供有用信息
    mininet中进行自定义命令iperfmulti功能拓展主要分为4步:
    1.修改mininet/net.py
    2.修改mininet/cli.py
    3.修改``bin/mn4.重新安装Mininet核心文件:~/mininet/util/install.sh -n`

最后一个实验,不做再做过多的介绍,就是在mn编写添加了一条测试带宽的命令。关于编写程序,暂时我还不会。

51Openlab上Mininet快速入门相关推荐

  1. apache thrift_Apache Thrift快速入门教程

    apache thrift Thrift是一种跨语言RPC框架,最初是在Facebook上开发的,现在作为Apache项目开源. 这篇文章将描述如何以不同的模式(例如阻塞,非阻塞和异步)编写Thrif ...

  2. Apache Thrift快速入门教程

    Thrift是一种跨语言RPC框架,最初是在Facebook上开发的,现在作为Apache项目开源. 这篇文章将描述如何以不同的模式(例如阻塞,非阻塞和异步)编写Thrift服务和客户端. (我觉得后 ...

  3. 【云计算】云上建站快速入门:博客、论坛、CMS、电子商务网站统统

    免费网站怎么建,空间也能免费吗? 免费网站怎么建立,免费网站并非免费空间 互联网真的有免费建站这等好事? 现在制作一个网站已经越来越容易了,只要知道清晰的流程之后都是可以很快的建好一个企业或者个人网站 ...

  4. git 上传项目到linux仓库_「成都校区」Git使用快速入门

    Git使用快速入门 1.在Linux上安装Git 输入git命令,查询是否安装了git (1)如果是Debian或Ubuntu Linux系统,使用如下命令进行安装: apt-get install ...

  5. matlab撤销上一步命令_CAD快速入门技巧:CAD软件中撤销操作的方法汇总

    在使用浩辰CAD软件画图的过程中都难免会误操作,因此CAD与WORD.EXCEL等其他软件一样,在误操作后可以通过"放弃"来取消刚进行的操作,Windows软件的常规操作也适用于C ...

  6. 快速入门:OpenShift上的Spring Boot和WildfFly 8.2

    与Spring Boot,WildFly和OpenShift相比,这是真正的"快速入门",与我上一篇更具描述性的文章相反. 先决条件 在开始构建应用程序之前,我们需要安装一个Ope ...

  7. python3 爬虫实例_【实战练习】Python3网络爬虫快速入门实战解析(上)

    原标题:[实战练习]Python3网络爬虫快速入门实战解析(上) 摘要 使用python3学习网络爬虫,快速入门静态网站爬取和动态网站爬取 [ 前言 ] 强烈建议:请在电脑的陪同下,阅读本文.本文以实 ...

  8. java撤销上一步_CAD快速入门技巧:CAD软件中撤销操作的方法汇总

    在使用浩辰CAD软件画图的过程中都难免会误操作,因此CAD与WORD.EXCEL等其他软件一样,在误操作后可以通过"放弃"来取消刚进行的操作,Windows软件的常规操作也适用于C ...

  9. 2引擎帮助文档_ANSA快速入门指南中文帮助文档浅析(上)

    作者 | 团长 仿真秀科普作者 首发 | 仿真秀公众号(ID:fangzhenxiu2018) 导读:本文是ANSA入门系列第一篇(后续将会在仿真秀官网或APP同步发布).本系列致力于提供ANSA软件 ...

最新文章

  1. 《概率机器人》速度运动模型gmapping中代码解析
  2. 伪造服务钓鱼工具Ghost Phisher
  3. 【Linux】tcp缓冲区大小的默认值、最大值
  4. 2020——网鼎杯 (青龙组)signal
  5. 获取小程序用户信息+java_java获取微信小程序用户信息
  6. 理解大型分布式网站你必须知道这些概念
  7. python命令行调试django代码_Django shell调试models输出的SQL语句方法
  8. 马斯克直聘AI人才:高中毕没毕业无所谓,但是编程能力得过
  9. 嵌入式linux组件,嵌入式Linux系统的几大组件!
  10. group by 和where 条件后面不能用刚设置的别名。
  11. 保存blob为本地文件
  12. Mr.J--JS事件监听(捕获冒泡)
  13. 不固定个数的子元素自适应居中
  14. 地下水环评(一级)实践技术及Modflow地下水数值模拟
  15. 实验01 使用网络协议分析仪Wireshark分析数据链路层帧结构实验报告
  16. 计算机考研金工,我的金工跨考经验
  17. struts2架构网站漏洞修复详情与利用漏洞修复方案
  18. android7 显示到pc,安卓手机上的画面怎么投屏到Win7电脑上?超详细投屏方法看这里!...
  19. 5种阿里常用代码检测推荐 | 阿里巴巴DevOps实践指南
  20. 宋丹丹晒年轻旧照 桃眼杏腮被赞美女

热门文章

  1. minio java的lifecycle
  2. java学习2018年_Java 20年
  3. 转 下一代云计算模式:Docker正掀起个性化商业革命
  4. postgresql 数据库巡检
  5. c语言程序如下,某C语言程序如下: #include stdio.h void main() { floa.._简答题试题答案...
  6. 鸿蒙系统照样没有谷歌服务,曝华为Mate40 Pro+升级鸿蒙2.0系统 谷歌服务照样能用...
  7. 在vue项目中使用gsap,实现极佳的2d动画效果
  8. 进制之间的快速转换法:8421码及原码反码补码之间的相互转换关系
  9. 感谢帮我的人们(Revit二次开发)
  10. 幸福温馨抑或婚姻枷锁——戴尔与EMC的蜜月期究竟进展如何?