自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

轻飘飞扬

认真关注一件事很难~所以你不成功!

  • 博客(430)
  • 资源 (20)
  • 收藏
  • 关注

原创 learning:vppsb router插件编译

前面文章中介绍了一篇博客:Learning VPP: OSPF routing protocol,文章中介绍使用VPPsb的router插件,它实现了将控制报文推到Linux网络堆栈的逻辑,以及一个基于netlink的机制,它将Linux的路由表同步到VPP的FIB中。本文主要尝试vppsb router查询在最新vpp21.06版本编译。并配置简单的ping业务正常。基本逻辑可以查询vpp官方指导文档:https://wiki.fd.io/view/VPP_Sandbox/router。源码解读后续有

2021-05-16 22:00:36 2534

原创 DPDK -20.5遇到的一些问题总结

源码下载及编译 dpdk 最新代码下载,可以再码云平台创建clone一个dpdk的项目,从码云平台上下载代码速度比较块,能达到2Mbps,直接从github上下载不是一个数量级。git clone https://gitee.com/jinshaohui/dpdk.git编译可以直接参照dpdk上的文档,目前是使用meson & ninja来进行源码编译,旧的编译方式也适用。首先需要安装工具meson,环境是是centos 7.5版本,需要更新成阿里源才能安装成功。[root@loca

2020-07-24 10:19:08 3366 8

原创 DPDK网卡设备加载流程

bus总线网卡设备扫描函数在目录dpdk/lib/librte_eal/common/eal_common_bus.cbus scan提供的主接口,内部会调用所有bus->scan。接口的目的是扫描所有bus下注册的设备。bus设备注册dpdk/lib/librte_eal/include/rte_bus.h是由宏RTE_REGISTER_BUS,在程序启动时完成的注册,目前查询宏使用的地方如下。/** * Helper for Bus registration. * The cons

2020-07-12 15:31:23 3205 1

原创 DPDK 内存管理---malloc_heap和malloc_elem

博文是基于dpdk20.5代码阅读所写,如理解有错误或不当之处,烦请指正,不甚感激。也可以私信我一起探讨。两种数据结构体介绍Malloc 库内部使用了两种数据结构类型(可以参考dpdk官方文档3.4.4章节介绍):struct malloc_heap:用于在每个 CPU Socket 上跟踪和管理可用内存空间。struct malloc_elem:Malloc 库内部用于追踪分配和释放空间的基本要素。基本内存分布结构说明malloc_elem介绍elem是heap管理内存的基本单元,内

2020-07-11 16:05:26 1676 2

原创 QOS相关基础知识总结

QOS基本概念三种令牌桶模式的区别和应用场景由前文描述可以看出,三种令牌桶模式之间既有区别也有演进关系,具体见下表。基于上述三种令牌桶模式之间的区别,其功能和使用场景也有所不同,具体见下表。参数设置有讲究在令牌桶算法中,CIR的值越大,即令牌产生的速率越大,报文可以获取的令牌就越多,流向网络的流量也就越大。因此,CIR的值是控制流入网络中流量多少的关键。CBS也是一个重要参数。CBS的值越大,C桶中可以积累令牌的数目也越多,允许通过的报文尺寸就越大。由于设备进行的是逐包转发,CBS的值不应

2020-07-09 12:23:28 4096

原创 通用路由封装协议——GRE

1、GRE简介 通用路由封装协议GRE(Generic Routing Encapsulation)可以对某些网络层协议(如IPX、ATM、IPv6、AppleTalk等)的数据报文进行封装,使这些被封装的数据报文能够在另一个网络层协议(如IPv4)中传输。GRE提供了将一种协议的报文封装在另一种协议报文中的机制,是一种三层隧道封装技术,使报文可以通过GRE隧道透明的传输,解决异种网络的传输问题。 在大多数常规情况下,系统拥有一个有效载荷(或负载)包,需要将它封装并发送至某个目的地。首先将有效载荷封

2020-06-13 15:46:56 3302

原创 IPsec协议总结

1、IPsec 基本介绍1.1 ipsec基本数据1.2 ipsec 封装模式传输模式传输模式在AH、ESP处理前后IP头部保持不变,主要用于End-to-End的应用场景。隧道模式隧道模式则在AH、ESP处理之后再封装了一个外网IP头,主要用于Site-to-Site的应用场景2 隧道模式下基本的封装和姐封装流程2.1 封装流程在原IP报文中找到TCP报文部分,在其后添加相应的ESP trailer信息。ESP trailer 包含三部分:Padding,Pad leng

2020-06-13 10:06:11 3772 1

原创 BGP消息处理学习

1、BGP 介绍1.1 相关术语1.2 BGP协议特点当前使用的版本是BGP-4。BGP作为事实上的Internet外部路由协议标准,被广泛应用于ISP(Internet Service Provider)之间。BGP协议具有如下特点:BGP是一种外部网关协议(EGP),与OSPF、RIP等内部网关协议(IGP)不同,其着眼点不在于发现和计算路由,而在于在AS之间选择最佳路由和控制路由的传播。BGP使用TCP作为其传输层协议,提高了协议的可靠性。BGP进行域间的路由选择,对协议的稳定性要求非

2020-06-11 18:11:34 1538

原创 arp基础学习

Arp基本学习如果要在TCP/IP协议栈中选择一个"最不安全的协议",那么我会毫不犹豫把票投给ARP协议。我们经常听到的这些术语,包括"网络扫描"、“内网渗透”、“中间人拦截”、“局域网流控”、“流量欺骗”,基本都跟ARP脱不了干系。大量的安全工具,例如大名鼎鼎的Cain、功能完备的Ettercap、操作傻瓜式的P2P终结者,底层都要基于ARP实现。听上去这么"逆天"的协议,其实技术原理又简单的难以置信,例如ARP整个完整交互过程仅需要两个包,一问一答即可搞定!但是ARP协议也有它令初学者迷惑的地方,例

2020-06-10 09:42:35 881

原创 路由基础学习--交换机及路由器基本转发

1、网络三要素及交换机工作原理1.1 HUB及Switch内部构造对比集线器采用广播的形式传输数据,即向所有端口传送数据。集线器是一种共享设备,本身不能识别目的地址,当同一网内的a主机向b主机发送数据时,数据包在以hub为架构的网络上以广播方式传输,由每一台终端通过验证数据包头的地址信息来确定是否接收,同一时刻网络上只能传输一组数据帧的通讯。此方式共享带宽。交换机上的所有端口均有独享的信道带宽,以保证每个端口上数据的快速有效传输。交换机为用户提供的是独占的、点对点的连接,数据包只被发送到目的端口,

2020-05-19 22:42:44 1071

原创 vpp源码阅读---node节点调度总结

调度类型总结调度方式总结个人理解:从代码上来看只有Input类型的node节点注册的时候state设置成中断方式,才会出现中断和轮训的切换,默认全是轮询方式。PRE_INPUT类型node只能按照轮询当时来调度。设置成state为中断也是一样的。中断方式和轮询方式之间切换。模式切换依据累计报文数量,在vlib_main_or_worker_loop启动中设置。PRE_INPUT和INPUT类型调度Pre_input类型只能在main线程上被调度,一般为Process类型提供输入。in

2020-05-17 10:44:19 5796 1

原创 DPDK-vpp 一次mbuf地址被踩的定位思路

上个月解决了一个mbuf地址异常导致程序coredump的问题,问题定位前后花了将近一个月的时间,期间也是一点定位思路都没有,写这篇文章希望有同样问题的提供一种解决思路。问题背景在业务转发流程中vpp 发包模块mtu 9000字节,多mbuf单链表串联场景下,其中一个mbuf的next地址是非法地址,从而导致程序coredump异常。异常调用栈分析 分析过程发现发包mubuf数组中tx_pkts[-1]的next是非法地址导致程序异常。通过vlib_buf的next_buffer反推下一个mbu

2020-05-13 10:39:34 2050

原创 VPP源码阅读----vppinfra 结构说明

vppinfra 相关结构学习相关视频地址可以在B站上搜索的,但是ppt暂时没有找到,自己的阅读截图说明了。vetvec结构是最基础的类型,图片的右下角的大字比较醒目,也是初学者很容易犯的错误:Allocation only increases,Vector origin pointer may changer,store indexes(not pointers)!vector 原始指针可能会改变,存储索引而不是指针。这种说法成立的前提是vector操作中不调用vec_del函数,否则也不能

2020-05-08 21:52:54 1791

原创 dpdk查寻是否支持此网卡

[jinsh@localhost dpdk-19.11]$ lspci -nn | grep Ethernet07:00.0 Ethernet controller [0200]: Intel Corporation I210 Gigabit Network Connection [8086:1533] (rev 03)08:00.0 Ethernet controller [0200]: I...

2020-05-05 22:09:49 3517

原创 Vpp源码解读--workhandoff处理

1、node节点handoff功能1.1、申请node节点对应vlib_frame_queue_main_t结构我们可以阅读以下函数ip4_sv_reass_init_function完成IP报文假重组功能中handoff使用u32 vlib_frame_queue_main_init (u32 node_index, u32 frame_queue_nelts)下面是对应结构体描述:...

2020-05-01 23:37:49 2520

原创 VPP源码阅读---IP报文重组和分片

1、dpdk ip报文重组相关数据接口及API1.1相关数据结构1.2 相关API/*NO.1 创建rte_ip_frag_tbl结构,用来暂存分片的表。其中max_cycles表示分片报文超时时间TTL *frag_cycle = (rte_get_tsc_hz()) + MS_PER_S –1) / MS_PER_S * 10; *是10ms的cycle的一个例子。 */str...

2020-04-25 17:14:31 4083 5

转载 Inferior 1 (process 663) exited with code 0177

网站查询到可以通过https://www.it1352.com/785461.html再gdb里面设置下面参数捕捉系统退出原因catch syscall exit exit_group调查过程:1、使用gdb调试,问题发生时,程序已退出,没有捕获到信号,无法抓到堆栈信息,串口只输出日志:[Inferior 1 (process 663) exited with code 0177]2...

2020-04-11 15:56:21 3888 1

原创 Linux虚拟化学习----day1

基本概念参考文章SAN典型网络模型----个人还不是很懂,记录下来

2020-03-29 21:39:39 311

原创 VPP源码阅读-------copy、clone、recycle机制对比分析

2020-03-17 09:34:55 688 2

转载 NUMA架构下的CPU拓扑结构

作者:weijitao来源:CSDN原文:https://blog.csdn.net/weijitao/article/details/52884422目前多核已经越来越普遍的使用,Linux对NUMA架构的支持也越来越完善。对于内存管理、多处理的负载均衡调度等进行了大量的优化工作。NUMA相关的几个概念有Node、Socket、Core 以及 Thread。Socket是一个物理上的...

2020-03-15 20:21:18 2054

原创 DPDK源码解读-------ring结构体

RTE RING结构体内存挂接挂接在全局rte_ring_tailq尾队列链表上ring_list = RTE_TAILQ_CAST(rte_ring_tailq.head, rte_ring_list);下面是相关的结构体声明及定义/*尾队列表头TAILQ_HEAD 宏定义*/#define TAILQ_HEAD(name, type) \ struct name { \...

2020-03-14 13:26:33 1556

原创 VPP源码-----mempool池创建解读

dpdk_buffer_pool_init函数处理逻辑如下:目前阅读最新的vpp(20-1)代码,报文存储区域rte_mbuf已经不再通过DPDK结构来申请了,目前是在vpp自己管理的物理内存上直接申请而来,下面是dpdk_buffer_pool_init的处理逻辑:rte_mempool相关结构体参数注解rte_mempool 相关内存的分布mempoll管理节点的内存分布将当前...

2020-03-11 17:25:13 1670 1

转载 libevent源码–TAILQ队列,

TAILQ 队列结构图其中tqh_first 指向队列的第一个结点tqh_last 指向队列的最后一个结点的 tqe_next 字段tqe_next 指向该结点的下一个结点tqe_prev 指向该结点的上一个结点的 tqe_next 字段根据结构图,TAILQ 队列为双向循环链表源码// 定义队列的头结点结构体的宏#define TAILQ_HEAD(name, type) ...

2020-03-10 14:16:20 504 1

原创 VPP源码----mheap结构学习

1、系统malloc和mmap对比malloc使用brk分配的内存,需要等到高地址内存释放以后才能释放,申请大内存(大于128k)时候使用的是mmap系统调用;mmap系统调用是在堆和栈之间分配一块内存,这块内存可以单独释放,不会造成内存“空洞”,也不会影响到堆顶内存的缩减释放。mmap的缺点是按需调页:一页大小4k bytes,如果需要的内存很小,会造成内存浪费;频繁的mmap、munma...

2020-03-04 11:09:12 1500

原创 Linux虚拟网络设备:bridge(桥)、vrouter、tun/tap等总结

相关知识链接Linux虚拟网络设备之tun/tapLinux虚拟网络设备之vethLinux虚拟网络设备之bridge(桥)Linux 虚拟网络设备详解之 “vRouter”Linux网络 - 数据包的发送过程Linux网络 - 数据包的接收过程...

2020-02-14 13:16:30 2102

原创 ipv4、ipv6编址

ipv4地址IPv4地址分类及特征IP地址按作用范围可分成两类,一类是在大网使用的公共IP地址,另一类是只在内网使用的私有地址。IP按用途可分五大类:A类(政府)、B类(公司)、C类(公用)、D类(组播)和E类(实验),地址格式为网络地址+主机地址或网络地址+子网地址+主机地址形式。 它们之间的区别和特征如下表所示:此外还有几个特殊IP地址:1、0.0.0.0只能做源地址2、255....

2020-02-06 17:02:46 1046

原创 Linux性能优化---CPU上下文切换

基本概念

2020-01-07 22:07:37 613

原创 计算机组成原理--动态链接

链接可以分动、静,共享运行省内存动态链接的基本思想是把程序按照模块拆分成各个相对独立部分,在程序运行时才将它们链接在一起形成一个完整的程序,而不是像静态链接一样把所有程序模块都链接成一个单独的可执行文件。 假设现在有两个程序program1.o和program2.o,这两者共用同一个库lib.o,假设首先运行程序program1,系统首先加载program1.o,当系统发现program...

2019-12-29 17:19:19 606

原创 计算机组成原理--计算机指令

编译到汇编,代码从如何变成机器码看下面的C代码示例:#include <stdio.h>int main(){ int a = 1; int b = 2; a = a + b; return 0 ;}通过编译和汇编后生成机器码[root@localhost ~]# gcc -g -c test.c [root@localhost ~]# ...

2019-12-16 22:37:03 4050

原创 PHP 自学之路-----XML基本语法及DTD介绍

Xml的出现解决了如下的问题 1 程序间数据的传输的问题 2 XMl可以做配置文件 3 Xml可以充当小型的数据库HTML的缺点(相对Xml) 1 HTML标签是规定好的,用户不能进行自定义 2 HTML文件显示的样式和数据是绑定在一起的,数据没有复用 3 HTML标签是没有含义的简单语法:1、注释 <!--d adad-->2、CDA...

2019-12-16 22:27:07 2259 1

原创 零值比较--BOOL,int,float,指针变量与零值比

这是程序员面试的一道常见题,也是个C++基础问题。若只在大学里看过几本基础的编程入门书,看见这道题可能会觉得奇怪,不就是和0比较吗,直接拿出来比就是了,其实非也。下文引自google搜索结果,出处不详,高手可以无视,菜菜留下,记得做好笔记。首先给个提示:题目中要求的是零值比较,而非与0进行比较,在C++里“零值”的范围可就大了,可以是0, 0.0 , FALSE或者“空指针”。int型变量 n 与...

2019-12-16 22:26:44 3424

原创 计算机组成原理---基本组成

计算机基本组成计算机基本组成脑图计算设备组成冯诺曼体系架构计算机性能评价程序性能优化思路计算机基本组成脑图计算设备组成冯诺曼体系架构计算机性能评价程序性能优化思路...

2019-12-15 15:54:54 260

原创 LInux性能优化--CPU篇之平均负载

1、平均负载基本概念2、实例分析2.1、环境搭建测试环境基于centos7.5版本[root@domain ~]# uname -aLinux domain 3.10.0-957.5.1.el7.x86_64 #1 SMP Fri Feb 1 14:54:57 UTC 2019 x86_64 x86_64 x86_64 GNU/Linuxcpu架构信息[root@domain ...

2019-12-02 10:37:29 572

原创 DPDK指南--编写高效的代码

简介本章提供了使用DPDK开发高效代码的一些技巧。有关更多的信息,请参考Intel®64和IA-32架构优化参考手册,这是编写高效代码的宝贵参考资料。1、内存 本节描述在DPDK环境中开发应用程序时的一些关键内存注意事项。1.1内存拷贝:不要在数据平面中使用libc在DPDK中可以通过Linux*应用程序环境获得许多libc函数。这可以简化应用程序的移植和配置平面的开发。然而,这些功...

2019-11-18 16:43:20 3234

原创 Vpp源码---hash mhash结构学习

Hash 结构哈希表默认是支持动态扩容的,即当哈希表存放键值对大于3/4哈希桶的个数时,会2倍扩容。哈希冲突时,vector长度认为是没有限制的。hash结构内存分布及结构体描述哈希结构内存分布如下图所示:hash冲突时是如何解决的哈希冲突解决分2中情况(具体代码在lookup()函数中):1、key和vlaue都保存时hash结构体中log2_pair_size不等于 0是,存...

2019-11-18 09:45:20 2758

转载 内存屏障和编译屏障的理解

在vpp和dpdk的编码经常遇到有内存屏障和编译屏障的地方,使用内存屏障会远远降低执行性能,实测大概有10%左右的性能损耗,在多核竞争下更加劣化。下面文章有详细的介绍:个人认为内存屏障是解决的时候多CPU下问题,而编译屏障是为了防止cpu优化。https://www.cnblogs.com/straybirds/p/8856726.html...

2019-11-15 10:28:08 1179

原创 vpp--arc_feature学习以ipv4单播为例

1、feature arc及feature注册 vnet\ipIp4_forward.c feature arc及feature的main函数启动前的注册宏feature arc注册 VNET_FEATURE_ARC_INIT将注册feature arc,主要初始化feature类的名称、起始及结束node名字及arc_index的指针。会以链表形式挂接到全局变...

2019-11-12 09:38:38 2622

原创 VPP 创建自己的work线程

1 创建自己的核绑定线程1.1 线程启动流程以worker线程为例,介绍线程启动流程:1.1.1 线程注册:VLIB_REGISTER_THREAD线程注册宏注册到全局 vlib_thread_main_tvlib_thread_main->next链表上。typedef struct vlib_thread_registration_ { /* constructor g...

2019-11-07 13:05:29 3082 1

转载 搭建lxr搭建自己的代码检索网站

linxu下阅读内核源代码,通常都使用vim + ctags 或者 lxr进行,我个人比较倾向于lxr,因为lxr提供了良好的界面,函数和定义都使用超链接标记出来,可以很方便的跟踪到函数内部去查看详细或者查看数据结构的定义等。网上有现成的网站提供了这样的服务,如果你只是偶尔看看内核源代码的话,其实直接登录某些提供这样服务的网站就差不多了,比如LXR,这个网站提供的体验相当不错,我以前就是经常在这个...

2019-10-17 09:56:47 842

原创 DPDK&VPP关键技术文档总结。

1、DPDK 流量管理API使用指南–TM2、为不同的Intel平台交叉编译DPDK;链接二3、DPDK数据包捕获框架4、DPDK中的memcpy性能优化及思考

2019-09-21 10:07:19 8901 1

redis设计与实现 第二版 高清 带标签 PDF文档.zip

本书详细描述了redis的功能点和内部实现,如果希望了解redis功能和深入研究redis实现细节,本书是一个很好的参考和借鉴,同时加入了目录结构,便于翻阅。 一共2个版本的PDF,都带有目录,可以选择自己舒服的版本阅读。

2019-07-22

强烈推荐 网络之路H3C数通技术23期汇总.zip

网络之路H3C数通技术23期汇总 QOS、组播、IPsec、vlan、HA、NAT等等详细基础知识

2019-07-13

linux VIM 配置文件

vimrc文件拷贝到用户家目录和root家目录下更名为.vimrc 两个TXT文件拷贝到/usr/share/vim/vim73/doc 目录下 两个VIM文件拷贝到/usr/share/vim/vim73/plugin目录下

2014-12-02

USBIP协议翻译

内核模块USBIP协议的linux侧,相关描述,是内核帮助文档的翻译。

2014-11-21

BMP图片编码x264文件

使用FFMpeg可以很方便的对音视频进行编码,并且写文件。 下面的代码是将5幅1280*720大小的图片进行编码,并且写到文件中

2014-11-15

VLC0.94版本

VLC 0.94版本windows安装程序,配合live555实现网页播放功能!

2014-11-11

live555项目Vs2010编译环境搭建及源码

Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目 它实现了对标准流媒体传输协议如RTP RTCP RTSP SIP等的支持 Live555实现了对多种音视频编码格式的音视频数据的流化 接收和处理等支持 包括MPEG H 263+ DV JPEG视频和多种音频编码 同时由于良好的设计 Live555非常容易扩展对其他格式的支持 目前 Live555已经被用于多款播放器的流媒体播放功能的实现 如VLC VideoLan MPlayer   该项目的源代码包括四个基本的库 各种测试代码以及IVE555 Media Server 四个基本的库分别是UsageEnvironment&amp;TaskScheduler groupsock liveMedia BasicUsageEnvironment ">Live555 是一个为流媒体提供解决方案的跨平台的C++开源项目 它实现了对标准流媒体传输协议如RTP RTCP RTSP SIP等的支持 Live555实现了对多种音视频编码格式的音视频数据的流化 接收和处理等支持 包括MPEG H 263+ DV JPEG视 [更多]

2014-09-06

ubuntu apt-get 软件源局域网或公网设置

打包的这些只是很少的一部分,比如,现在你要在客户机中#apt-get install vim那肯定是安装不了的,因为主机中根本就没有,如果想要安装怎么办,就在主机进行操作之前把软件给安装好apt-get install vim apt-get install ssh。这样就可以了,或者你可以把官方的软件源全部下载下来,那样体积会非常大。所以我只安装我自己需要的。

2014-06-25

linux C 内存池实现

C语言实现的内存池!j利用默认的内存管理函数new/delete或malloc/free在堆上分配和释放内存会有一些额外的开销。

2014-05-16

XSTUNT 源码 linux 环境及相应API说明

XSTUNT 源码 linux 环境及相应API说明 基于TCP的 NAT穿透技术源码!

2014-05-05

ubuntu dpkg制作安装包

介绍在unbuntu系统下如何制作deb安装包程序!

2014-03-31

基于TCP,UDP NAT穿透资料附源码

基于TCP,UDP NAT穿透资料附源码

2014-01-12

GTK基础编程

GTK2.0 基础编程教程,详细的实例进行学习。只要循序渐进的学习,没有什么不可能的

2013-11-17

易宝支付PHP代码

商家正式运行时,必须把自己的服务器部署在公网上的服务器上,这样支付成功后易宝支付的服务器才能支付结果及时返回给商家 为了商家技术工程师开发的方便,如果测试服务器在工程师自己的服务器上,可以把URL设定为localhost的方式,浏览器可以正式返回。

2013-09-07

XPath基础教程

XPath的设计的核心思想,可以通过xpath迅速简介的定位到你希望查找的节点。主要目的是描述节点相对其他节点的位置,可以取得所有符合条件的节点,成为[位置路径]。

2013-08-31

PJSIP 开源代码及文档

PJSIP是一个开源的SIP协议库,它实现了SIP、SDP、RTP、STUN、TURN和ICE。PJSIP作为基于SIP的一个多媒体通信框架提供了非常清晰的API,以及NAT穿越的功能。PJSIP具有非常好的移植性,几乎支持现今所有系统:从桌面系统、嵌入式系统到智能手机。

2013-01-30

华清嵌入式培训编写代码程序

本人在华清嵌入式培训机构4个月时间,所编写的所有代码,里面有各个文件夹,很方便大家阅读~

2012-12-17

数据结构笔记数据结构

Linux C 数据结构相关资料 很详细的

2012-12-12

jeffy-vim 很强的一个vim插件及配置

linux vi编辑器的自动补齐功能,能让你长的代码无需记住,自动显示;很多常用的命令,对代码阅读和写很有帮助

2012-11-30

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除