自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(113)
  • 收藏
  • 关注

原创 如何在一个shell脚本中开启多个应用程序?

之前在csdn上搜索,提示用gnome-terminal指令,但是发现怎么都不好使。于是找到一种解决方案。#!/bin/bashecho "the first one"./hello fork &sleep 10echo "the second one"./hello 只要在可执行程序后添加"fork &"即可,测试两个程序同时执行。测试程序#include<iostream>#include <unistd.h>using namespa

2021-03-09 20:36:11 4095

原创 命令行读取参数

有时需要从命令读取一些输入,这里找到一个方法,怎么实现的没有仔细研究,但是可用。//cmdline.h/* Copyright (c) 2009, Hideyuki Tanaka All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions a

2021-01-13 22:16:57 426

原创 读取配置文件的程序

时常会遇到需要从配置文件中读取一些信息,这里就提供一个例子,方便日后使用://ini.h#pragma once#ifdef __cplusplusextern "C" {#endif#define INI_VERSION "0.1.1"typedef struct ini_t ini_t;ini_t* ini_load(const char *filename);void ini_free(ini_t *ini);const char* ini_get(in

2021-01-12 20:56:17 364 1

原创 QUIC代理客户端代码阅读

1、首先是从配置问价中读取配置信息,读取配置文件的代码如下,可留着备用//从配置文件中读取数据  配置文件所在的位置  /src/client_config.iniDEFINE_QUIC_COMMAND_LINE_FLAG(std::string, client_ini_file, "client_config.ini", "

2021-01-12 15:20:47 586

原创 QUIC项目epoll服务器分析

在前面的分析的过程中,我们发现epoll服务器已经注册了两个事件:这是proxy_server_bin.cc的代码1、eps_->RegisterFD(fd, this, kEpollFlags);2、 epoll_server_.RegisterFD(fd_, this, kEpollFlags);注册完毕之后,就剩下等待事件发生eps.WaitForEventsAndExecuteCallbacks();查看这个函数:void SimpleEpollServer::WaitFo

2021-01-11 19:41:59 518

原创 QUIC学习记录

QUIC学习记录QUIC代理代码阅读:proxy_server_bin.cc1、创建一个backend 智能指针,并实例化一个ProxyServerBackend()对象 std::unique_ptr<quic::ProxyServerBackend> backend (new ProxyServerBackend());//创建一个智能指针呢backend,指向ProxyServerBackend()实例查看这个ProxyServerBackendclass ProxySe

2021-01-11 14:25:35 519 1

原创 利用TAP设备实现透明传输

TUN/TAP设备是Linux内核的虚拟网络设备,可以利用TUN设备实现IP数据包的透明传输,TAP设备实现以太网帧的透明传输。利用此项技术,我们就可以在不更改应用程序的基础上使用一些新的传输协议。TUN/TAP介绍一TUN/TAP介绍二TUN/TAP介绍三基于特定的应用场景,本次使用TAP设备,实现以太网帧的搬运。这里仅仅用于测试,后面可在此基础上使用QUIC协议传输。网络拓扑:#!/usr/bin/pythonfrom mininet.topo import Topofrom minin

2021-01-06 15:10:05 1017

原创 TCP透明代理

基于Mininet的网络拓扑图:3h.py#!/usr/bin/pythonfrom mininet.topo import Topofrom mininet.net import Mininetfrom mininet.cli import CLIfrom mininet.link import TCLinkimport timeimport datetimeimport subprocessimport os,signalimport sys# # h

2020-12-30 12:33:32 709

原创 python小白的踩坑之旅

最近因为工作需要,频繁使用python来写脚本,有时候你会感叹这么语言的神奇和强大的功能,有时候又会死于毙命。今天就是因为一些小问题搞了一天,脑壳疼。首先就是None,这是个啥玩意儿,啥也不是。因为在做判断得时候遇到了None,这个玩意儿怎么判都不行,怎么判都不对,搞不明白! a=None b='' if a==b: print '相等' else: print '不相等' print(type(a)) print(a) p

2020-08-14 21:01:54 172

原创 TCP超时重传时间的选择

在之前的学习中,只是知道TCP的发送方在规定的时间内没有收到确认就要重传已经已发送的报文段,我们都知道TCP有个超时计时器,但是这个重传时间是怎么选择的缺一无所知,今天在这里栽了跟头。打开计算机网络的书本,赶紧记录以下吧。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200411090600473.jpg?x-oss-process=image/wa...

2020-04-11 09:08:17 872

原创 求一个数组的非空子集

//求一个数组的子集#include <vector>#include<iostream>using namespace std;vector<vector<int>>A;void subset(int a[], int n){ int count = 1 << n;//子集个数 左移就相当于乘以2 //遍历[0,...

2020-03-27 17:40:40 1618

原创 中序转逆波兰式

#include <stack>#include<iostream>#include <string>#include <vector>#include <algorithm>using namespace std;//先给运算符设置优先级 + -设置为1 * /设置为2 #设置为0 因为#是一开始放进去的 int p...

2019-12-27 10:48:22 312

原创 字符串 substr函数的应用

#include<iostream>#include<string>using namespace std;int main(){ string s="ABABC"; cout<<s.substr(2)<<endl;//ABC cout<<s.substr(0,2)<<endl;//AB cout<<...

2019-12-12 22:19:42 208

原创 bit_xor的使用

今天遇到以一个bit_xor的情况,就是于是写了一个测试函数: 1 #include <iostream> // std::cout 2 #include <numeric> 3 #include <functional> // std::bit_xor 4 #include <algorithm> // std::...

2019-12-10 22:26:53 1247

转载 ubuntu 18.04安装protobuf

今天需要安装protobuf 在网上搜了一篇教程 ,但是篇幅太长 ,于是对其进行简化一下。原文1、```git clone https://github.com/protocolbuffers/protobuf.git2、`sudo apt-get install autoconf automake libtool curl make g++ unzip`3、`cd protobuf/`...

2019-10-14 10:53:42 5508 2

原创 C++中逗号运算符

今天测试代码的时候 ,遇到一行代码出现了疑问,原因是出现了自减运算符和逗号运算符,这就涉及到一个顺序的问题,于是写了一个C++小程序 ,验证了一下这个想法。#includeusing namespace std;int main(){int i=1,j=2;i–,j+=i;cout<<j<<endl;return 0;}``测试过后 发现代码的值任然是2...

2019-09-23 21:57:48 390 2

原创 遇见的几个C++中的string 函数

今天遇到了erase()这个函数erase函数的原型如下:(1)string& erase ( size_t pos = 0, size_t n = npos );(2)iterator erase ( iterator position );(3)iterator erase ( iterator first, iterator last );也就是说有三种用法:(1)era...

2019-09-04 22:11:45 145

原创 从文件中读取数据发现最后一个数据读取两遍的问题

#include<stdio.h>#include<stdlib.h>#define N 100int main(){ FILE *fp; int i, n, x, a[N], s; fp = fopen("E:\\aa.txt", "r"); n = 0; while (1) { fscanf(fp, "%d", &x); if(feof...

2019-09-02 11:20:08 1413

原创 怎样判断一个vector中矩阵的行数和列数

经常要遇到vector容器中放一个矩阵 在对这个居正进行操作的时候需要用到这个矩阵的行数和列数,时常忘了该怎么求这里记录一下、vector<vector<int>>& matrix//这是一个矩阵 int rows=matrix.size();//求得行数 int col=matrix[0].size();//求的列数...

2019-08-31 16:31:44 3083

原创 hash_multimap的源码

hash_multimap的特性与multimap完全相同,唯一的差别在于它的底层机制是hashtable,也因此,hash_multimap的元素不会被自动排序hash_multimap与hash_map的唯一差别就在于,前者的元素插入操作采用insert_equal,而后者采用insert_uniquehashtable无法处理元素型别,hash_mutimap也没有办法处理tem...

2019-07-04 11:17:49 208

原创 hash_set的源码分析

hash_multiset的特性与multiset完全相同,唯一的差别在于它的底层机制就是hashtable也因此,hash_multiset的元素不会被自动排序hash_multiset与hash_set唯一的区别就是在于前者从插入使用的是insert_equal后者采用的是insert_uniquehashtable无法处理的型别,hash_multiset也没有办法处理templa...

2019-07-04 09:59:40 146

原创 hash_set的源码

hash_set是以hashtable为底层机制。所以hash_set所供应的操作接口hashtable都提供了,所以几乎所有的hash_set操作行为,都只是转调用hashtable的操作而已RB-tree有自动排序功能,但是hashtable没有,相应的hashset也没有set不像map那样可以同时拥有实值value和键值key,set元素的键值就是实值,实值就是键值set的元素有自...

2019-07-03 11:06:11 126

原创 遇到的几个c++问题

第一个问题,在对字符数组向int转换时需要注意:转换的时候需要减去‘0’于是我做了一个测试#include<iostream>#include<string>using namespace std;int main(){string str="123";int n=str[0];cout<<n;return 0;}此时的输出结果为49,很...

2019-07-01 11:38:40 301

原创 multiset和multimap源码

multiset的特性以及用法个set完全相同,唯一的差别就在于它允许键值重复。因此的它的插入操作采用的是底层机制RB_tree的isnert_equal()而不是insert_unqiue(),下面是multiset的源代码提要,只是列出了与set的不同之处template <class Key,class Compare=less<Key,class Alloc=alloc&...

2019-07-01 09:38:18 261

原创 map

map的特性是,所有的元素都会根据元素的键值自动被排序,map的所有元素都是pair,同时拥有实值(value)和键值(key)。pair的第一个元素被视为键值,第二个元素被视为实值。map不允许两个元素有相同的键值。//下面给出<stl_pair.h>中的pair的定义template<class T1,class T2>struct pair{typedef ...

2019-06-30 11:39:58 145

原创 set源码分析及实例

/**set的特性是:所有的元素都会根据元素的键值自动被排序。set的元素不像map那样可以同时拥有实值(value)和键值(key)set元素的实值就是键值,键值就是实值set不允许有两个相同的键值不能通过set叠加器改变set的值由于rb_tree是一种平衡二叉搜索树,自动排序的效果很不错,所以标准的STL set即以rb_tree为底层机制*///下面将展示set的源码te...

2019-06-28 15:09:18 752

原创 红黑树源码分析

所谓的红黑树(RB_tree)不仅是一个二叉搜索树,而且必须满足一下规则:1):每个节点不是红色就是黑色2):根节点是黑色3):如果节点是红色,那么它的子节点必须是黑色4):任一结点至NULL(树尾端)的任何路径,所含的黑节点数必须相同根据规则4):那么新增结点必须是红色节点,根据规则3):新增结点的父结点必须是黑色![插入结点当我们插入一些点的时候,可能会违反红黑树的规则,那么我们...

2019-06-26 11:01:23 525 2

原创 slist源码

slist是一个单向列表 相比与双向列表所耗用的空间更小,某些操作更快根据STL习惯,插入操作会将新元素插入指定位置之前 而非之后。然后作为一个单向链表,slist没有任何方便的办法可以回头定出前一个位置,因此他必须从头找起。换句话说,除了slist起点附近的点之外,其他位置上采用inset和erase操作函数,都不是一种好的选择为了克服这个缺点 slist提供了insert_after()...

2019-06-21 17:17:05 788

原创 priority_queue的源代码以及实例

priorityu_queue是一个拥有权值观念的queue,它允许加入新元素,移除旧元素,审视新元素等功能由于这是一个queue,所以只允许在底端加入元素,并从顶端取出元素,除此之外别无其他存取元素的途径priority 带有其内的元素并非是依照被推入的顺序排列,而是自动依照元素的权值排列,权值最高者排在前面缺省情况下priority_queue利用max-heap完成,可以满足prior...

2019-06-21 14:58:00 580

原创 heap的实现

binary heap是一种complete binary tree(完全二叉树)也就是说,整棵树binary tree除了最底层的叶节点之外,是填满的.而最底层的叶节点(s)由左至右又不得有空隙 如图是一个complete binary tree.使用了一个小技巧 就是将array数组的#0元素保留(或设为最大值或这无限小值),那么当complete bianry tree中的某个节点位于...

2019-06-19 11:02:16 587

原创 queue源码分析

stack是一种先进后出的数据结构,只有一个出口,允许新增,移除,取得最顶端元素,但是除了最顶端外,没有任何其他方法可以存取stack的其他元素.换言之,就是不允许有遍历行为将元素推入stack的操作称为push,将元素推出stack的操作称为pop.由于stack系一地步容器完成其所有工作,而具有这种修改某物接口,形成另一种风貌之性质者,称为adapter(配接器)所以 STL stac...

2019-06-18 10:26:02 453

原创 stack源码分析

stack是一种先进后出的数据结构,只有一个出口,允许新增,移除,取得最顶端元素,但是除了最顶端外,没有任何其他方法可以存取stack的其他元素.换言之,就是不允许有遍历行为将元素推入stack的操作称为push,将元素推出stack的操作称为pop.由于stack系一地步容器完成其所有工作,而具有这种修改某物接口,形成另一种风貌之性质者,称为adapter(配接器)所以 STL stac...

2019-06-18 09:25:59 266

原创 deque源码分析

/*vector是单向开口的连续线性空间,deque是双向开口的线性空间,所谓双向开口,意思就是可以在头尾两端分别做元素的插入和删除操作deque可以在常规时间内对起头端分别做元素的插入和删除操作deque没有所谓的容量概念,它是以动态地分段连续空间组合而成的,可以增加一段新的空间并连接起来对deque进行排序操作,为了最高效率,可将deque先完成复制到一个vector中,将vecotr...

2019-06-17 14:59:45 616

原创 list容器的源码以及实例

以下是list的node结点设计template <class T>struct __list_node{ typedef void* void_pointer;//型别是void *,但是实际上可以设为__list_node<T>* void_pointer prev; void_pointer next; T data;};list不再向vector一样...

2019-06-12 15:14:47 413

原创 vector源码以及实例

/*vector与array数组比较类似 但是array是静态空间,一旦配置了空间就不能够再改变vecotr是动态空间,随着元素的加入,它的内部机制就会自行扩充空间来容纳新的元素//下面将真是vector函数的具体实现//vector是一个连续的线性空间*///alloc是SGI的空间配置器template <class T,Alloc=alloc>class vect...

2019-06-10 18:44:26 599

原创 使用posix_quic-master传输文件

首先修改原函数的客户端#include "quic_socket.h"#include "debug.h"#include <string.h>#include <stdio.h>#include <string>#include <sys/epoll.h>#include <sys/poll.h>#include &lt...

2019-06-10 09:20:37 670 3

原创 迭代器

迭代器的定义: 提供一种方法,使之能够巡访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表达方式STL的中心思想是将容器和算法分开,然后用迭代器将两者联系起来//以find为例子template <class InputIterator ,class T>InputIterator find(InputIterator first,InputIterator la...

2019-06-08 15:29:25 929

原创 空间配置与释放, std::alloc

C++的内存配置基本操作是 ::operator new( ),内存释放基本操作是 ::operator delete().这两个全局函数相当于C的malloc()和free()函数.正是如此,SGI正是以malloc()和free()完成内存的配置与释放.考虑到小型区块的可能造成的内存破碎问题,SGI设计了双层级配置器,第一级配置器直接使用malloc()和free(),第二级配置器则视情况而...

2019-06-05 16:37:29 592

原创 posix_quic-master代码中test部分的试运行

前期一直在分析client端与server端的逻辑以及其中的一些函数,这里我们尝试着运行一下这里的代码首先,运行这套代码需要用到go语言,所以我们需要搭建一个go环境.(也是直接开始运行的时候,发现报错,提示要安装go)于是我把自己搭建go环境的过程记录了下来添加链接描述然后我们开始运行代码cd posix_quic-master//建立一个build文件夹mkdir buildcd...

2019-06-04 15:10:20 466 1

原创 linux下安装kurento并简单测试

最近因为要用到kurento,于是在网上找了许多下载教程,踩了很多的坑 ,于是这里记录一下安装过程 以及遇到的问题第一步sudo apt-get update \ && sudo apt-get install --no-install-recommends --yes \ gnupg这一步的时候,在sudo apt-get update的 时候可能会报错,...

2019-06-04 10:53:32 1533

空空如也

空空如也

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

TA关注的人

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