();
node->AggregateObject (factory);
}
}
在ns-3(TCP,IP路由)中存在多个实现的情况下,这些对象由factory object(TCP)或routing helper (m_routing)添加。
请注意,路由协议在此功能之外进行配置和设置。 默认情况下,添加以下协议:
void InternetStackHelper::Initialize ()
{
SetTcp ("ns3::TcpL4Protocol");
Ipv4StaticRoutingHelper staticRouting;
Ipv4GlobalRoutingHelper globalRouting;
Ipv4ListRoutingHelper listRouting;
Ipv6ListRoutingHelper listRoutingv6;
Ipv6StaticRoutingHelper staticRoutingv6;
listRouting.Add (staticRouting, 0);
listRouting.Add (globalRouting, -10);
listRoutingv6.Add (staticRoutingv6, 0);
SetRoutingHelper (listRouting);
SetRoutingHelper (listRoutingv6);
}
By default, IPv4 and IPv6 are enabled.
Internet Node structure
一个Internet Stack Node包含如下几个组件:
Layer-3 protocols
在TCP/IP网络体系中,在网络接口之上的为网络层IP,包括IPv4,IPv6,ARP等。 Ipv4L3Protocol类是网络层IP实现类,其公共接口通常是Ipv4类,但Ipv4L3Protocol公共API现在也在内部使用。
在Ipv4L3Protocol类中,有一个方法是Receive()。网络层IP从下层获取分组,然后分析出其源地址IP和目的地址IP:
/**
* Lower layer calls this method after calling L3Demux::Lookup
* The ARP subclass needs to know from which NetDevice this
* packet is coming to:
* - implement a per-NetDevice ARP cache
* - send back arp replies on the right device
*/
void Receive( Ptr device, Ptr p, uint16_t protocol,
const Address &from, const Address &to, NetDevice::PacketType packetType);
首先请注意,Receive()函数对类Node中的ReceiveCallback具有匹配的签名。Receive()函数第一个参数指向Device节点,这个Device是在配置节点前预先安装在Node节点中的协议,而这个函数能够被下层自动调用的前提是通过如下代码来实现的:
RegisterProtocolHandler ( MakeCallback (&Ipv4Protocol::Receive, ipv4),Ipv4L3Protocol::PROT_NUMBER, 0);
Ipv4L3Protocol对象被聚合到Node中; 每个节点只有一个这样的Ipv4L3Protocol对象。高层的协议(如TCP)要发送一个TCP数组分组给Ipv4L3Protocol对象是通过调用函数GetObject ()来获取该节点的底层协议的,如下所示:
Ptr ipv4 = m_node->GetObject ();
if (ipv4 != 0)
{
ipv4->Send (packet, saddr, daddr, PROT_NUMBER);
}
这个类很好地演示了我们在ns-3中利用的两种技术将对象绑定在一起:回调和对象聚合。
一旦IPv4路由确定一个数据包是发送到本地节点的,IPv4对象就会把分组发送给上层协议。 这是通过以下功能完成的:
void
Ipv4L3Protocol::LocalDeliver (Ptr packet, Ipv4Header const&ip, uint32_t iif)
第一步是根据IP协议号找到正确的Ipv4L4Protocol对象。例如,TCP以协议号6注册在demux中。最后,调用Ipv4L4Protocol上的Receive()函数(如TcpL4Protocol :: Receive)。
我们还没有引入Ipv4Interface类。基本上,每个NetDevice都会有一个IP地址与其对应。在Linux中,这个类的Ipv4Interface大致对应于struct in_device;主要目的是提供一个关于接口的详细信息。
所有的类都有适当的Traces,以跟踪发送,接收和丢失的数据包。鼓励用户使用它们,以便找出是否(以及在哪里)丢弃数据包。一个常见的错误是在发送数据包(例如ARP队列)时忘记本地队列的影响。使用UDP发送巨大数据包时就会给用户带来问题。 由于ARP缓存挂起队列是有限的(3个数据报),并且IP分组可能被分段,在发送数据时就有可能造成数据的溢出。在这种情况下,将ARP缓存暂挂大小增加到适当的值是很有用的,例如:
Config::SetDefault ("ns3::ArpCache::PendingQueueSize", UintegerValue (MAX_BURST_SIZE/L2MTU*3));
IPv6实施遵循类似的体系结构。 双堆栈节点(支持IPv4和IPv6)将允许IPv6套接字接收IPv4连接,如同标准的双堆栈系统一样。 绑定并监听IPv6端点的套接字可以接收IPv4连接,并将远程地址作为IPv4映射地址返回。 目前不支持IPV6_V6ONLY套接字选项。
Layer-4 protocols and sockets
在TCP/IP中,网络层的上层为传输层,下面讨论如何把传输层协议和套接字以及应用绑定在一起,每一个传输层协议的实现都是一个套接字工厂,每一个应用程序都需要一个套接字。
例如,要创建一个UDP套接字,应用程序将使用如下的代码片段:
Ptr udpSocketFactory = GetNode ()->GetObject ();
Ptr m_socket = socketFactory->CreateSocket ();
m_socket->Bind (m_local_address);
...
首先。第一行代码是从Node节点中获取一个UDP套接字工厂指针来创建一个套接字(第二行),然后通过第三行代码把套接字绑定到地址上,如果作为参数的地址已经绑定了其他套接字,则会出现错误而不是覆盖。Bind(void)和Bind6(void)函数分别绑定到“0.0.0.0”和“::”。
通过BindToNetDevice(Ptr netdevice)函数也可以将套接字绑定到特定的NetDevice。 BindToNetDevice(Ptr netdevice)会将套接字绑定到“0.0.0.0”和“::”(相当于调用Bind()和Bind6(),除非套接字已经绑定到特定的地址)。 正确的顺序是:
Ptr udpSocketFactory = GetNode ()->GetObject ();
Ptr m_socket = socketFactory->CreateSocket ();
m_socket->BindToNetDevice (n_netDevice);
...
or
Ptr udpSocketFactory = GetNode ()->GetObject ();
Ptr m_socket = socketFactory->CreateSocket ();
m_socket->Bind (m_local_address);
m_socket->BindToNetDevice (n_netDevice);
...
下面的会产生错误:
Ptr udpSocketFactory = GetNode ()->GetObject ();
Ptr m_socket = socketFactory->CreateSocket ();
m_socket->BindToNetDevice (n_netDevice);
m_socket->Bind (m_local_address);
...
到目前为止,我们已经描述了一个套接字工厂(例如class Udp)和一个可以专用的套接字(例如,class UdpSocket)。还有几个关键的对象用来完成分解数据包成为一个或多个sockets。此任务中的关键对象是class Ipv4EndPointDemux。此分解器存储类Ipv4EndPoint的对象。该类包含与套接字关联的寻址/端口元组(本地端口,本地地址,目标端口,目标地址)和接收回调。这个接收回调具有由套接字注册的接收功能。 Ipv4EndPointDemux的Lookup()函数返回一个Ipv4EndPoint对象的列表(可能有一个列表,因为多个套接字可能与数据包匹配)。第4层协议将数据包复制到每个Ipv4EndPoint,并调用其ForwardUp()方法,然后调用由套接字注册的Receive()函数。
在真实系统上使用套接字API时出现的问题是需要使用某种类型的I / O(例如,阻塞,非阻塞,异步...)来管理从套接字读取。 ns-3为套接字I / O实现一个异步模型;应用程序设置一个回调,通知接收到的数据准备被读取,当数据可用时,回调由传输协议调用。这个回调被指定如下:
void Socket::SetRecvCallback (Callback,Ptr,const Address&> receivedData);
正在接收的数据在分组数据缓冲区中传送。 一个示例用法是在PacketSink类中:
m_socket->SetRecvCallback (MakeCallback(&PacketSink::HandleRead, this));
总结一下,UDP内部实现是这样的:
- UdpImpl类完成UDP socket工厂的功能
- UdpL4Protocol类实现了独立于套接字的协议逻辑
- UdpSocketImpl类实现UDP的套接字特定方面
- Ipv4EndPoint的类,用于存储与套接字关联的寻址元组(本地端口,本地地址,目标端口,目标地址)以及套接字的接收回调。
Example path of a packet
Step in packet sending process
- Application在之前会创建一个socket(here,UDPSocket)它会调用Socket::Send()。真实数据或伪数据会通过API传递。
- Socket::Send转发给UdpSocketImpl::DoSend(),随后转发给UdpSocketImpl::DoSendTo().这些函数设置正确的源地址和目的地址,处理socket调用,例如bind()和connect()。然后UdpL4Protocol::Send()方法会被调用。在真实实现中,socket必须查询Ipv4路由系统找到正确的源地址去匹配目的地址。
- UdpL4Protocol是UDP实现的与套接字无关的协议逻辑。 Send()方法加入UDP头,初始化校验和,并发送数据包给Ipv4层。数据包并不是直接发送给Ipv4层的,而是通过叫做m_downTarget的callback。在这例子中,downTarget是Ipv4L3Protocol,但是也可以是一些其他层。
- Ipv4L3Protocol加入IP头并加数据包传递给正确的Ipv4Interface实例,根据UDP层传递下来的路由。在这个例子中,是一个支持Arp的设备。
-
Ipv4Interface会查找MAC地址如果此NetDevice技术支持Arp。如果有缓存,则发送包给NetDevice,否则它会首先开始Arp请求然后等待回应。
Step in packet receiving process
- NetDevice调用注册在Node::m_receiveCallback中的方法
- 这是一个典型的Node::ReceiveFromDevice()功能
- Node::ReceiveFromDevice存储了一系列回调(协议头),可以通过协议号和设备查找。在这个例子中,Ipv4L3Protocol::Receive()会被找到且调用
- Ipv4L3Protocol已出IP头,检查校验和,并将数据包传递由Ipv4L3Protocol注册的Ipv4RoutingProtocol。在这个例子中的路由协议会决定这个数据包是给本地的,所以它调用Ipv4L3Protocol::LocalDeliver().这个方法查找协议(在这里是UDP)并且调用Receive()方法。
- UdpL4Protocol在这里UDP实现的独立于套接字的协议逻辑。Receive()方法会移除UDP头并且查找每个流的语义状态,也就是在Ipv4EndPointDemux中存储的一个或多个IpV4EndPoint对象(src addr,src port,dest addr,dest port)。在结束时,调用Ipv4EndPoint::ForwardUp()方法。
-
Ipv4EndPoint有一个回调,在这个回调中,Socket对象可以注册receive方法。在这里,这个回调调用UdpSocketImpl::ForwardUp()方法
7.当数据准备被读取时,UdpSocketImpl调用Applicaiton设置的Recv() 回调。应用程序会调用套接字Recv()或者RecvFrom()方法从套接字读取数据。
你可能感兴趣的:(Internet Stack)
- Stack(栈)
alien爱吃蛋挞
Javajava数据结构
定义:在Java编程语言中,栈(Stack)是一种非常重要的数据结构,具有后进先出的特性,即最后入栈的元素最先出栈。栈通常用于存储临时性的数据,如方法调用过程中的局部遍历、操作数栈等。图像理解:我们在这里要理解栈顶和栈底。这里的"顶"和"底"与我们常识中的顶端和底端是相反的。栈顶(Top):栈顶是栈中最后加入的元素的位置。在栈的操作中,所有入栈(push)和出栈(pop)的操作都是针对栈顶元素进行
- 网络安全 CIS全称 网络安全ca
网络安全Jack
web安全安全网络
CA中心的概念::CA中心的核心职能是发放和管理用户的数字证书。CA中心在整个电子商务环境中处于至关重要的位置,它是整个信任链的起点。CA中心是开展电子商务的基础,如果CA中心不安全或发放的证书不具权威性,那么网上电子交易就根本无从谈起。CA中心所发放的数字安全证书就是网络通讯中标志通讯各方身份信息的一系列数据,提供了一种在Internet上验证您身份的方式,其作用类似于司机的驾驶执照或日常生活中
- KubeBlocks 如何降低管理多种数据库的学习门槛
什么是KubeBlocksKubeBlocks是一个开源的Kubernetes数据库operator,能够帮助用户在Kubernetes上运行和管理多种类型的数据库。据我们所知,大多数数据库operator通常只能管理某种特定类型的数据库,例如:CloudNativePG、Zalando、CrunchyData、StackGresoperator用于管理PostgreSQLStrimzi用于管理K
- windows中HyperV为ubuntu指定固定IP
飞瀑
ubuntulinux运维
1.配置Windows主机的网络打开“控制面板”->“网络和共享中心”->“更改适配器设置”。找到与InternalSwitch对应的网络适配器(通常名为vEthernet(InternalSwitch))。右键点击适配器,选择“属性”。双击“Internet协议版本4(TCP/IPv4)”。选择“使用下面的IP地址”,设置一个固定IP(如172.168.10.2),子网掩码为255.255.25
- 能不能解释一下本地方法栈?思维导图 代码示例(java 架构)
用心去追梦
java架构开发语言
本地方法栈(NativeMethodStack)本地方法栈是JVM运行时数据区的一部分,类似于Java虚拟机栈,但用于支持本地方法(通常是用C/C++编写的)的调用。本地方法栈主要用于存储本地方法的信息,如局部变量、操作数栈等。特点线程私有:每个线程都有自己的本地方法栈,互不影响。生命周期:本地方法栈的生命周期与线程相同,线程启动时创建,线程结束时销毁。栈帧:每个本地方法调用时都会创建一个栈帧,方
- 反向代理如何工作
菠萝派爱跨境
大数据服务器运维安全网络
1.代理服务器和反向代理之间的区别在探索反向代理的工作原理之前,了解代理服务器和反向代理之间的区别非常重要。代理服务器主要代表客户端或客户端网络,处理从客户端到Web服务器的流量。其主要功能包括为客户端提供匿名性、允许访问公共数据访问限制以及保护客户端的安全。反向代理是位于一组Web服务器和Internet之间的服务器,代表这些服务器处理流量。与代理服务器不同,反向代理通过隔离服务器和客户端之间的
- flask和django的对比
dev.null
Pythonflaskdjangopython
Flask和Django都是流行的PythonWeb框架,尽管它们都用于构建Web应用,但它们的设计理念和使用场景有所不同。以下是它们之间的一些对比:1.框架类型Flask:微框架(Micro-framework),意味着它提供的是最基础的功能,其他功能(如数据库支持、身份验证等)需要通过第三方插件来扩展。Django:全栈框架(Full-stackframework),提供了很多内建的功能,如O
- windows7 IIS远程执行代码漏洞ms15-034,导致系统蓝屏
dhl383561030
linux安全
一.windows7系统打开iis服务方法1.控制面板-程序-程序和功能-打开关闭功能-internet服务-万维网全选-WEB管理工具全选,要保证镜像光盘是打开状态、防火墙是关闭的。2.可以使用默认网站,但是需要进行绑定。在绑定完毕之后要进行物理机访问是否成功。3.ms15-034是IIS漏洞ms-17-010是smb漏洞二、通过MSF进行漏洞验证:1.msfconsole#进入msf2.sea
- Win7如何有效的屏蔽广告弹窗?
2401_88800025
笔记运维
在使用win7电脑打开一些软件或者浏览器的时候,会经常遇到广告弹窗弹出,有时候关闭了还是经常会出现,一般遇到这种问题应该怎么去解决呢?下面就和小编一起来看看解决办法吧。Win7屏蔽广告弹窗的解决办法1、点击电脑左下方的‘开始’按钮,点击‘控制面板’打开。2、找到‘Internet选项’打开。3、点击‘隐私’。
- 网工必备知识点(Essential Knowledge Points for Internet Workers)
Linux运维老纪
无所畏惧走进计算机网络世界网络服务器运维开发容器云计算
网工必备知识点网络工程师是信息技术领域中不可或缺的职业,负责设计、实施和管理网络系统,确保企业内外部的通信安全、流畅。要成为一名合格的网络工程师,掌握基础知识是必不可少的。一、交换机是一种网络设备,通过学习MAC地址来决定数据包的传输路径,是现代网络中实现高效数据交换的关键设备。二、路由器是一种网络设备,用于在不同网络间路由数据包,实现网络间的通信。它工作在网络层,通过路由表寻址转发数据包。三、防
- LeetCode Hot100 394.字符串解码
doglc
LeetCode每日刷题记录#LeetCode中等题leetcode算法
classSolution{public:stringdecodeString(strings){//使用两个栈:栈1存储数字;栈2存储待拼接的string//在遇到']'时,两个栈栈顶出栈stringnumber;stringres;stacknumStack;stackstrStack;for(charc:s){if(isdigit(c)){number.push_back(c);}elsei
- 【译】Nodejs应用安全备忘录
本人的博客http://www.wjs.photo/,感兴趣的可以看看哦,基于NodeJs框架ThinkJs本文翻译自www.risingstack.com,并非逐字逐句的翻译,有错误的地方请指出,谢谢啦应用程序的安全就像是你房间里突然出现一只大象,那么明显,但是写代码的同学还是会忽略。也都认为应用程序的安全非常重要但是却很少有时间认真对待,毕竟我们有那么多bug要改(坏笑)。所以我们整理了一个N
- C# 使用 ServiceStack.Redis链接哨兵redis服务端
望天hous
C#备忘redis数据库服务器
Redis哨兵RedisSentinel是运行高可用性Redis配置的官方建议,通过运行许多额外的redissentinel进程来主动监控现有的Redis主从实例,以确保它们都按预期工作。如果通过共识确定主服务器不再可用,它将自动故障转移并将其中一个复制的从服务器提升为新的主服务器。哨兵还维护可用redis实例的权威列表,为客户端提供中心存储库以发现他们可以连接的可用实例。对RedisSentin
- CentOS虚机在线扩容系统盘数据盘
robin5911
编程开发openstack操作系统centoslinux运维
最近在制作Openstack下的镜像,用户需要CentOS6以及CentOS7的虚机镜像,遇到了些关于系统盘以及数据盘在线扩容的问题,故此整理一下。传统我们想对磁盘在线热扩容,必然会想到LVM逻辑卷。如果没有LVM逻辑卷的情况下,则可以考虑使用growpart命令。#yum-yinstallcloud-utils-growpart在内核3.6.0以上,是可以实现系统盘在线扩容的,如果低版本内核则需
- Elasticsearch 集群 和 Kibana:最新版 8.15.0 手动安装教程
程风破~
ElasticsearchElasticsearch实战Java宝藏elasticsearch大数据搜索引擎ES8.15.0ES最新版本集群部署教程
1.前言Elasticsearch和Kibana是ElasticStack的核心组件,分别扮演着数据存储与检索、分析和数据可视化的角色。1.1Elasticsearch简介Elasticsearch是一个基于JSON的分布式搜索和分析引擎,它提供了一个分布式、多租户能力的全文搜索引擎,具有HTTP网络接口和无模式的数据索引,不依赖于任何特定的数据库结构。Elasticsearch的设计目标之
- StackExchange.Redis官方文档(二)【配置】
.NET跨平台
redis文档配置
配置配置Redis有很多不同的方式,StackExchange.Redis提供了一个丰富的配置模型,我们可在调用Connect或者ConnectAsync方法时传入配置:varconn=ConnectionMultiplexer.Connect(configuration);在这里参数configure可以是:ConfigurationOptions实例配置字符串方式配置后面一种也是前面一种的标记
- HCIE必须培训才能考吗?真相是……
HCIE考证研究所
网络工程师华为认证HCIE
提到HCIE,许多网络工程师心中都会有一个共同的疑问:“我必须参加培训,才能顺利通过考试吗?”毕竟,HCIE不仅代表着技术水平的巅峰,也是一张“硬通货”证书。那么,这个问题的答案到底是什么?今天,我们就来仔细分析一下,帮助大家做出更合适的备考选择。01HCIE考试有多难?HCIE(HuaweiCertifiedInternetworkExpert)是华为认证体系中的顶级认证,考试的内容覆盖非常广泛
- JAVA--栈和队列
子夜夏歌
数据结构java
栈-Stack栈是一种先入后出的限定性线性表。数据的插入和删除操作仅在同一端进行,称为栈顶(top),另一端为固定的一端,称为栈底(Bottom)。特征是先入后出。栈有两种基本操作push进栈(栈顶插入)和pop出栈(删除栈顶),基本实现有数组(顺序栈)和链表(链式栈)。顺序栈的实现System.arraycopy(src,srcPos,dest,destPos,length);可实现动态扩容pu
- java数据结构详解!就是这么简单!(栈、队列、二叉树、红黑树等)
Java_Yhua
java二叉树数据结构
目录1.数据结构1.1栈(stack)1.2.队列(queue)1.3.链表(Link)1.4.散列表(HashTable)1.5.排序二叉树1.5.1.插入操作1.5.2.删除操作1.5.3.查询操作1.6.红黑树1.6.1.红黑树的特性1.6.2.左旋1.6.3.右旋1.6.4.添加1.6.5.删除1.7.B-TREE1.8.位图1.数据结构1.1栈(stack)栈(stack)是限制插入和删
- rust内存分配,内存回收,内存泄露
乌拉乌拉liang
rustrust开发语言内存
内存泄露首先我们先来讲内存泄露,rust中有两种方式可以造成内存泄露。循环引用如下的代码执行之后我们在控制台与系统监视器中监控进程执行过程,测试路程如下。首先在控制台打印mainfunctionstart的时候内存还未分配太多,索引进程占用内存还是很小的。等到空太太打印startaddmem以后,可以看到系统监视器中进程内存占用增加到了30多MB。但是看到outsidestack_alloc打印到
- JVM的栈里面存的是栈帧,栈帧里面存的是什么?
众乐乐_2008
面试java
JVM栈帧(StackFrame)——更完整的解释栈帧(StackFrame)是JVM方法执行时的最小单位,每个方法被调用时,JVM都会在**虚拟机栈(JVMStack)**中创建一个栈帧。当方法执行完成后,栈帧出栈,方法调用结束。一个栈帧的结构(完整)栈帧组件作用局部变量表(LocalVariableTable)存放方法的参数和局部变量(基本类型、对象引用、returnAddress)操作数栈(
- 2024广东省职业技能大赛云计算——容器云平台(K8S集群)搭建
kuuuugua
广东省职业技能大赛云计算云计算容器k8skubernetesistiodocker
容器云平台搭建前言容器镜像使用的是斗学培训平台提供的镜像包,这东西网上都没有,一堆人要,我是靠自己想的方法获取到了,也不敢给。你们可以通过在这个网站申请环境进行操作https://ncc.douxuedu.com/虚拟机使用的是自行创建的CentOS7,如果你不会,那虚拟机创建的流程可以参考我这篇文章:职业技能大赛云计算赛项实战——OpenStack搭建-CSDN博客CentOS7系统选择2009
- 2024广东省职业技能大赛云计算——Redis主从架构
kuuuugua
广东省职业技能大赛云计算云计算redis架构
Redis主从架构前言Redis是一个开源的内存数据结构存储系统,一般用于作为数据库、缓存和消息代理使用,而主从架构是许多分布式系统中常见的设计模式,用来提高系统的性能、可靠性和扩展性。虚拟机使用的是自行创建的CentOS7,如果你不会,那虚拟机创建的流程可以参考我这篇文章:职业技能大赛云计算赛项实战——OpenStack搭建-CSDN博客使用镜像为CentOS-7-x86_64-DVD-2009
- 将Hyper-V虚拟机与主机共享网络
qq_58647543
网络
Hyper-V网络设置目标将Hyper-V虚拟机网络配置为与主机使用同一网络,并确保主机网络与虚拟机网络连接互不受影响。前提条件主机上已安装Hyper-V已创建Hyper-V虚拟机步骤1.配置主机网络共享打开控制面板->网络和Internet->网络连接。右键点击WIAN,选择“属性”。切换到“共享”选项卡。勾选“允许其他网络用户通过此计算机的Internet连接进行连接”。在“家庭网络连接”下拉
- centos ubuntu 服务器性能比较,对比平台--CentOS和Ubuntu之间的区别
weixin_39883208
centosubuntu服务器性能比较
CentOS与Ubuntu是SoftwareOperationMarket中两个著名的Web服务器操作系统。CentOS基本上基于Linux框架和Linux发行版,以实现免费的,社区支持的计算平台,该平台与相应的上游源RedHatLinux兼容。Ubuntu基本上是基于Debian的开源Linux发行版。它是流行的云操作系统之一。它通常从桌面到云,再到几乎所有适用的Internet连接事物都运行。
- Go, Jocko, Kafka
后端go
本篇内容是根据2016年8月份#31.Go,Jocko,Kafka音频录制内容的整理与翻译TravisJeffery参加了节目,谈论Go、Jocko、Kafka、Kafka的存储内部结构如何工作,以及有趣的Go项目和新闻。ErikSt.Martin:大家好,欢迎回到《GoTime》的另一期节目。今天是第31期。我们的赞助商是StackImpact和Backtrace。今天的节目中有我自己,Erik
- 用队列实现栈和用栈实现队列(下)
Excuse_lighttime
算法java开发语言jvm数据结构
目录一.队列实现栈:题目链接题解代码:题解思路:二.栈实现队列:题目链接题解代码:题解思路:一.队列实现栈:题目链接题解代码:privateQueues1;privateQueues2;publicMyStack(){s1=newLinkedList();}publicvoidpush(intx){if(empty()){s1.offer(x);return;}if(!s1.isEmpty()){
- 数据结构回顾:栈、链表与二叉查找树
小向1190
pythonpandas开发语言数据结构
1.栈(Stack)1.1概念栈是一种后进先出(LIFO,LastInFirstOut)的数据结构。可以将其想象成一叠盘子,最后放上去的盘子最先被取走。1.2基本操作Push(入栈):将元素添加到栈顶。Pop(出栈):移除栈顶的元素。Peek(查看栈顶):查看栈顶的元素,但不移除。isEmpty(判空):检查栈是否为空。2.链表(LinkedList)2.1概念链表是一种线性数据结构,由一系列节点
- 数据结构——内核链表使用(2)
做自己'S Catanin
数据结构链表
完成编辑链式队列和循环队列的编写循环队列实现主函数main.c↓↓↓↓↓#include#include#include#include"clrqueue.h"intmain(void){queue_t*pstack=NULL;pstack=create_queue(6);enter_queue(pstack,1);enter_queue(pstack,2);enter_queue(pstack,
- C#操作excel数据,第一步先保存到Redis,第二步再保存到Sql Server数据库。第三步同步到MongoDB中
管理大亨
C#系列数据库c#excel
以下是一个完整的C#示例,展示如何将Excel数据依次保存到Redis、SQLServer和MongoDB中。代码分为三个步骤,并使用异步编程模型提高性能。---###**实现步骤**1.**读取Excel数据**:使用`EPPlus`库读取Excel文件。2.**保存到Redis**:使用`StackExchange.Redis`将数据缓存到Redis。3.**保存到SQLServer**:使用
- LeetCode[位运算] - #137 Single Number II
Cwind
javaAlgorithmLeetCode题解位运算
原题链接:#137 Single Number II
要求:
给定一个整型数组,其中除了一个元素之外,每个元素都出现三次。找出这个元素
注意:算法的时间复杂度应为O(n),最好不使用额外的内存空间
难度:中等
分析:
与#136类似,都是考察位运算。不过出现两次的可以使用异或运算的特性 n XOR n = 0, n XOR 0 = n,即某一
- 《JavaScript语言精粹》笔记
aijuans
JavaScript
0、JavaScript的简单数据类型包括数字、字符创、布尔值(true/false)、null和undefined值,其它值都是对象。
1、JavaScript只有一个数字类型,它在内部被表示为64位的浮点数。没有分离出整数,所以1和1.0的值相同。
2、NaN是一个数值,表示一个不能产生正常结果的运算结果。NaN不等于任何值,包括它本身。可以用函数isNaN(number)检测NaN,但是
- 你应该更新的Java知识之常用程序库
Kai_Ge
java
在很多人眼中,Java 已经是一门垂垂老矣的语言,但并不妨碍 Java 世界依然在前进。如果你曾离开 Java,云游于其它世界,或是每日只在遗留代码中挣扎,或许是时候抬起头,看看老 Java 中的新东西。
Guava
Guava[gwɑ:və],一句话,只要你做Java项目,就应该用Guava(Github)。
guava 是 Google 出品的一套 Java 核心库,在我看来,它甚至应该
- HttpClient
120153216
httpclient
/**
* 可以传对象的请求转发,对象已流形式放入HTTP中
*/
public static Object doPost(Map<String,Object> parmMap,String url)
{
Object object = null;
HttpClient hc = new HttpClient();
String fullURL
- Django model字段类型清单
2002wmj
django
Django 通过 models 实现数据库的创建、修改、删除等操作,本文为模型中一般常用的类型的清单,便于查询和使用: AutoField:一个自动递增的整型字段,添加记录时它会自动增长。你通常不需要直接使用这个字段;如果你不指定主键的话,系统会自动添加一个主键字段到你的model。(参阅自动主键字段) BooleanField:布尔字段,管理工具里会自动将其描述为checkbox。 Cha
- 在SQLSERVER中查找消耗CPU最多的SQL
357029540
SQL Server
返回消耗CPU数目最多的10条语句
SELECT TOP 10
total_worker_time/execution_count AS avg_cpu_cost, plan_handle,
execution_count,
(SELECT SUBSTRING(text, statement_start_of
- Myeclipse项目无法部署,Undefined exploded archive location
7454103
eclipseMyEclipse
做个备忘!
错误信息为:
Undefined exploded archive location
原因:
在工程转移过程中,导致工程的配置文件出错;
解决方法:
- GMT时间格式转换
adminjun
GMT时间转换
普通的时间转换问题我这里就不再罗嗦了,我想大家应该都会那种低级的转换问题吧,现在我向大家总结一下如何转换GMT时间格式,这种格式的转换方法网上还不是很多,所以有必要总结一下,也算给有需要的朋友一个小小的帮助啦。
1、可以使用
SimpleDateFormat SimpleDateFormat
EEE-三位星期
d-天
MMM-月
yyyy-四位年
- Oracle数据库新装连接串问题
aijuans
oracle数据库
割接新装了数据库,客户端登陆无问题,apache/cgi-bin程序有问题,sqlnet.log日志如下:
Fatal NI connect error 12170.
VERSION INFORMATION: TNS for Linux: Version 10.2.0.4.0 - Product
- 回顾java数组复制
ayaoxinchao
java数组
在写这篇文章之前,也看了一些别人写的,基本上都是大同小异。文章是对java数组复制基础知识的回顾,算是作为学习笔记,供以后自己翻阅。首先,简单想一下这个问题:为什么要复制数组?我的个人理解:在我们在利用一个数组时,在每一次使用,我们都希望它的值是初始值。这时我们就要对数组进行复制,以达到原始数组值的安全性。java数组复制大致分为3种方式:①for循环方式 ②clone方式 ③arrayCopy方
- java web会话监听并使用spring注入
bewithme
Java Web
在java web应用中,当你想在建立会话或移除会话时,让系统做某些事情,比如说,统计在线用户,每当有用户登录时,或退出时,那么可以用下面这个监听器来监听。
import java.util.ArrayList;
import java.ut
- NoSQL数据库之Redis数据库管理(Redis的常用命令及高级应用)
bijian1013
redis数据库NoSQL
一 .Redis常用命令
Redis提供了丰富的命令对数据库和各种数据库类型进行操作,这些命令可以在Linux终端使用。
a.键值相关命令
b.服务器相关命令
1.键值相关命令
&
- java枚举序列化问题
bingyingao
java枚举序列化
对象在网络中传输离不开序列化和反序列化。而如果序列化的对象中有枚举值就要特别注意一些发布兼容问题:
1.加一个枚举值
新机器代码读分布式缓存中老对象,没有问题,不会抛异常。
老机器代码读分布式缓存中新对像,反序列化会中断,所以在所有机器发布完成之前要避免出现新对象,或者提前让老机器拥有新增枚举的jar。
2.删一个枚举值
新机器代码读分布式缓存中老对象,反序列
- 【Spark七十八】Spark Kyro序列化
bit1129
spark
当使用SparkContext的saveAsObjectFile方法将对象序列化到文件,以及通过objectFile方法将对象从文件反序列出来的时候,Spark默认使用Java的序列化以及反序列化机制,通常情况下,这种序列化机制是很低效的,Spark支持使用Kyro作为对象的序列化和反序列化机制,序列化的速度比java更快,但是使用Kyro时要注意,Kyro目前还是有些bug。
Spark
- Hybridizing OO and Functional Design
bookjovi
erlanghaskell
推荐博文:
Tell Above, and Ask Below - Hybridizing OO and Functional Design
文章中把OO和FP讲的深入透彻,里面把smalltalk和haskell作为典型的两种编程范式代表语言,此点本人极为同意,smalltalk可以说是最能体现OO设计的面向对象语言,smalltalk的作者Alan kay也是OO的最早先驱,
- Java-Collections Framework学习与总结-HashMap
BrokenDreams
Collections
开发中常常会用到这样一种数据结构,根据一个关键字,找到所需的信息。这个过程有点像查字典,拿到一个key,去字典表中查找对应的value。Java1.0版本提供了这样的类java.util.Dictionary(抽象类),基本上支持字典表的操作。后来引入了Map接口,更好的描述的这种数据结构。
&nb
- 读《研磨设计模式》-代码笔记-职责链模式-Chain Of Responsibility
bylijinnan
java设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
/**
* 业务逻辑:项目经理只能处理500以下的费用申请,部门经理是1000,总经理不设限。简单起见,只同意“Tom”的申请
* bylijinnan
*/
abstract class Handler {
/*
- Android中启动外部程序
cherishLC
android
1、启动外部程序
引用自:
http://blog.csdn.net/linxcool/article/details/7692374
//方法一
Intent intent=new Intent();
//包名 包名+类名(全路径)
intent.setClassName("com.linxcool", "com.linxcool.PlaneActi
- summary_keep_rate
coollyj
SUM
BEGIN
/*DECLARE minDate varchar(20) ;
DECLARE maxDate varchar(20) ;*/
DECLARE stkDate varchar(20) ;
DECLARE done int default -1;
/* 游标中 注册服务器地址 */
DE
- hadoop hdfs 添加数据目录出错
daizj
hadoophdfs扩容
由于原来配置的hadoop data目录快要用满了,故准备修改配置文件增加数据目录,以便扩容,但由于疏忽,把core-site.xml, hdfs-site.xml配置文件dfs.datanode.data.dir 配置项增加了配置目录,但未创建实际目录,重启datanode服务时,报如下错误:
2014-11-18 08:51:39,128 WARN org.apache.hadoop.h
- grep 目录级联查找
dongwei_6688
grep
在Mac或者Linux下使用grep进行文件内容查找时,如果给定的目标搜索路径是当前目录,那么它默认只搜索当前目录下的文件,而不会搜索其下面子目录中的文件内容,如果想级联搜索下级目录,需要使用一个“-r”参数:
grep -n -r "GET" .
上面的命令将会找出当前目录“.”及当前目录中所有下级目录
- yii 修改模块使用的布局文件
dcj3sjt126com
yiilayouts
方法一:yii模块默认使用系统当前的主题布局文件,如果在主配置文件中配置了主题比如: 'theme'=>'mythm', 那么yii的模块就使用 protected/themes/mythm/views/layouts 下的布局文件; 如果未配置主题,那么 yii的模块就使用 protected/views/layouts 下的布局文件, 总之默认不是使用自身目录 pr
- 设计模式之单例模式
come_for_dream
设计模式单例模式懒汉式饿汉式双重检验锁失败无序写入
今天该来的面试还没来,这个店估计不会来电话了,安静下来写写博客也不错,没事翻了翻小易哥的博客甚至与大牛们之间的差距,基础知识不扎实建起来的楼再高也只能是危楼罢了,陈下心回归基础把以前学过的东西总结一下。
*********************************
- 8、数组
豆豆咖啡
二维数组数组一维数组
一、概念
数组是同一种类型数据的集合。其实数组就是一个容器。
二、好处
可以自动给数组中的元素从0开始编号,方便操作这些元素
三、格式
//一维数组
1,元素类型[] 变量名 = new 元素类型[元素的个数]
int[] arr =
- Decode Ways
hcx2013
decode
A message containing letters from A-Z is being encoded to numbers using the following mapping:
'A' -> 1
'B' -> 2
...
'Z' -> 26
Given an encoded message containing digits, det
- Spring4.1新特性——异步调度和事件机制的异常处理
jinnianshilongnian
spring 4.1
目录
Spring4.1新特性——综述
Spring4.1新特性——Spring核心部分及其他
Spring4.1新特性——Spring缓存框架增强
Spring4.1新特性——异步调用和事件机制的异常处理
Spring4.1新特性——数据库集成测试脚本初始化
Spring4.1新特性——Spring MVC增强
Spring4.1新特性——页面自动化测试框架Spring MVC T
- squid3(高命中率)缓存服务器配置
liyonghui160com
系统:centos 5.x
需要的软件:squid-3.0.STABLE25.tar.gz
1.下载squid
wget http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE25.tar.gz
tar zxf squid-3.0.STABLE25.tar.gz &&
- 避免Java应用中NullPointerException的技巧和最佳实践
pda158
java
1) 从已知的String对象中调用equals()和equalsIgnoreCase()方法,而非未知对象。 总是从已知的非空String对象中调用equals()方法。因为equals()方法是对称的,调用a.equals(b)和调用b.equals(a)是完全相同的,这也是为什么程序员对于对象a和b这么不上心。如果调用者是空指针,这种调用可能导致一个空指针异常
Object unk
- 如何在Swift语言中创建http请求
shoothao
httpswift
概述:本文通过实例从同步和异步两种方式上回答了”如何在Swift语言中创建http请求“的问题。
如果你对Objective-C比较了解的话,对于如何创建http请求你一定驾轻就熟了,而新语言Swift与其相比只有语法上的区别。但是,对才接触到这个崭新平台的初学者来说,他们仍然想知道“如何在Swift语言中创建http请求?”。
在这里,我将作出一些建议来回答上述问题。常见的
- Spring事务的传播方式
uule
spring事务
传播方式:
新建事务
required
required_new - 挂起当前
非事务方式运行
supports
&nbs