原创
青梦丶
荣者自安安,庸者定碌碌.
展开
-
chrome85及其85以上版本更新
前一段时间有用户使用chrome进行webrtc通信失败,查看服务日志发现是dtls握手失败。在本地尝试复现的时候发现和chrome版本有关系。继续抓包定位,发现实在dtls握手第二部的时候失败的,客户端校验失败,当时初步判断和服务没有关系,应该是浏览器的原因,当时看最新版chrome的更新日志发现有关于webrtc的安全更新,但是修复的bug详情看不到,然并卵,浏览器不受控,而且看腾讯和声网的webrtc都可以正常使用,所以必须得解决,最后经过不断的google和尝试,发现将服务端和浏览器建立媒体连接时下原创 2020-11-04 23:23:44 · 919 阅读 · 2 评论 -
centos 下编译licode
原生licode只支持ubuntu,而自己经常使用centos因此想要在cent下编译licode。写篇博客记录下遇到的问题。期间也查看了搜索了各种帖子以及博客发现,大家在centos下编译碰到的问题都不全一样,想来也可以理解,licode版本,操作系统版本不一样的话都可能导致不同的问题,下面是我的操作系统版本以及我遇到的问题(问题主要是erizo模块) 。LSB Version: :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:原创 2020-06-22 00:41:13 · 502 阅读 · 0 评论 -
wireshake分析stun协议
不知道为什么,我用wireshake过滤stun协议过滤不出来,抓包发现解析出来的和3478端口交互的都是udp的数据,弄个半天没弄好,想着udp就udp吧,反正是为了学习,顺道写篇博客记录一下。过滤掉UDP包头后,前两位是0,对应stun协议的前两位,前两个字节整体为0x0001 是bind request请求这两个字节为0,说明这个请求的消息只有头部,没有body,没错。这一段,前面4字节是cookie,后面 Transaction Id 记录下就行,和响应等会对比下这个是从3478发往本原创 2020-05-20 02:47:38 · 2537 阅读 · 0 评论 -
(转载)stl中list的sort算法实现
https://blog.csdn.net/qq276592716/article/details/7932483list不能使用STL算法sort(),必须使用自己的sort()member functiion,因为STL算法sort()只接受Ramdon Access Iterator.template <class _Tp, class _Alloc> void li...转载 2018-05-03 18:42:58 · 400 阅读 · 0 评论 -
inotify
转载自:http://blog.csdn.net/longwang155069/article/details/54016789 http://blog.csdn.net/shreck66/article/details/46974155 Inotify是一个Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify反应灵敏,用法非常简单,并且比cron任务的繁忙...转载 2018-02-28 06:33:38 · 188 阅读 · 0 评论 -
TCP协议
TCP的特点是面向连接、字节流、一对一和可靠传输。 当发送端应用程序连续执行多次写操作时,TCP模块先将这些数据放入TCP发送缓冲区中,当TCP模块真正开始发送数据时,发送缓冲区中这些等待发送的数据可能被封装成一个或多个TCP报文段发出。因此,TCP模块发送出的TCP报文段的个数和应用程序执行的写操作次数之间没有固定的数量关系。 当接收端收到一个或多个TCP报文段后,TCP模块将它们携带的应用原创 2018-02-06 21:07:35 · 461 阅读 · 0 评论 -
插入排序
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元...原创 2018-03-06 22:42:10 · 122 阅读 · 0 评论 -
选择排序
思想:选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。void swap(int*a,int*b){ int temp;...原创 2018-03-06 22:07:24 · 165 阅读 · 0 评论 -
IPv6头部结构
IPv6不仅解决了IPv4地址不够用的问题,还做了很大改进。比如:增加了多播和流的功能,为网络上媒体内容的质量提供精细的控制;引入自动配置功能,使得局域网管理更方便;增加了专门的网络安全功能等。IPv6固定头部结构 IPv6头部由40字节的固定头部和可变长的扩展头部。 4位版本号指定IP协议的版本。对于IPv6来说,其值是6。8位通信类型指示数据流通信类型或优先级,和IPv4中的TO原创 2018-02-06 11:38:00 · 3921 阅读 · 0 评论 -
IP转发
对于允许IP数据报转发的系统(主机或路由器),数据报转发子模块将对期望转发的数据报执行如下操作: 1)检查数据报头部的TTL值,如果TTL值已经是0,则丢弃该数据报 2)查看数据报头部的严格源路由选择选项,如果该选项被设置,则检测数据报的目标IP地址是否是本机的某个IP地址,如果不是,则发送一个ICMP源站选路失败报文给发送端。 3)如果有必要,则给源端发送一个ICMP重定向报文,以告诉它一原创 2018-02-06 10:54:13 · 287 阅读 · 0 评论 -
线程与进程
Unix 从其产生伊始就将进程作为它的重要组成部分而线程是后来才加进去的。进程的概念非常清晰且统一。而线程却有着一系列的起源,它们的属性也各不相同。进程与线程有根本上的不同。每个进程有其独立的数据空间、文件描述符以及进程的ID 。而线程共享一个数据空间、文件描述符以及进程 ID 。 (1)共享数据空间 这里考虑一个在存储器中存储了巨大而复杂的树结构数据库的数据库系统。多个线程可以轻易地读取到这原创 2018-01-29 23:36:31 · 192 阅读 · 0 评论 -
学习线程
线程认识: 首先 Linux 并不存在真正的线程,Linux 的线程是使用进程模拟的。 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进 程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是 CPU 调度和分派的基本单位,它是比进程更小 的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点 在运行中必不可少的资源(如程序计数器,一组寄存器和栈原创 2018-01-29 13:36:50 · 125 阅读 · 0 评论 -
daemon的用法
#include <unistd.h> int daemon(int nochdir, int noclose);daemon()函数适用于希望从控制终端脱离并作为系统守护进程在后台运行的程序。 如果nochdir为零,daemon()将进程的当前工作目录更改为根目录(“/”); 否则,当前工作目录保持不变。 如果noclose为零,daemon()将标准输入,标准输出和...原创 2018-02-22 15:49:21 · 4003 阅读 · 0 评论 -
错误信息:Cannot jump from switch statement to this case
用switch case出现了一个错误,cannot jump from switch statement to this case…. 查阅资料发现,是因为switch case 中是不能定义对象的,因为只要是在大括号内定义的对象,定义对象的地方要用{}包括...原创 2018-03-02 11:30:12 · 923 阅读 · 0 评论 -
html 控件隐藏和radio不可选状态
Html 控件的隐藏 1 隐藏并且不占据的位置document.getElementById('myVideo').style.display = "none”;//隐藏document.getElementById('myVideo').style.display = “block”;//显示2 隐藏但是仍占据的位置document.getElementById(Id).style.v...原创 2018-12-28 11:36:43 · 3188 阅读 · 0 评论 -
Mac安装Licode(错误总结)
安装licode 失败期间碰到各种各样问题,建议在纯净的环境下安装,要不然总是碰到这种各样的问题,最后两次尝试在纯净的ubuntu 14.04 和Mac(不清楚版本)安装都成功了,并且问题较少,下面写一下安装中记录的一部分问题: 遇到问题:sudo chown -R hostname(自己的主机名) /usr/local/ 没有权限 解决办法:Mac系统root用户没有权限修改/usr...原创 2018-12-28 11:24:15 · 933 阅读 · 0 评论 -
boost::asio::io_service
最近在学习licode发现源码有使用到boost::asio::io_service,因此在网上找文章了解一下,顺便写篇博客记录io_service 负责和操作系统打交道,等待所有异步操作的结束,然后为每一个异步操作调用其完成处理程序。例子(我们有3个异步操作,2个socket连接操作和一个计时器等待操作):有一个io_service实例和一个处理线程的单线程例子:io_service ...原创 2018-12-19 17:20:18 · 2623 阅读 · 4 评论 -
STL空间配置器
STL六大组件及关系: 图片来源:博览网空间配置器:内存池实现小块内存分配,对应到设计模式–单例模式(工具类,提供服务,一个程序只需要一个空间配置器即可),享元模式(小块内存统一由内存池进行管理)迭代器:迭代器模式,模板方法容器:STL的核心之一,其他组件围绕容器进行工作:迭代器提供访问方式,空间配置器提供容器内存分配,算法对容器中数据进行处理,仿函数伪算法提供具体的策略,类型萃取...转载 2018-07-31 10:40:59 · 152 阅读 · 0 评论 -
快速幂取模算法详解
1.大数模幂运算的缺陷: 快速幂取模算法的引入是从大数的小数取模的朴素算法的局限性所提出的,在朴素的方法中我们计算一个数比如5^1003%31是非常消耗我们的计算资源的,在整个计算过程中最麻烦的就是我们的5^1003这个过程 缺点1:在我们在之后计算指数的过程中,计算的数字不都拿得增大,非常的占用我们的计算资源(主要是时间,还有空间) 缺点2:我们计算的中间过程数字大的恐怖,我们现有的计算机...转载 2018-05-28 20:24:28 · 4590 阅读 · 0 评论 -
RSA算法详解及C语言实现
1、什么是RSA RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年首次公布,当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。 RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数...转载 2018-05-28 18:53:31 · 98543 阅读 · 22 评论 -
关于ios::sync_with_stdio(false);和 cin.tie(0)加速c++输入输出流
在网上查看别人的ACM代码时,发现别人输入输出语句用的总是scanf与printf,有点不解,还以为他们用的都是C语言,而非C++,但今天做的一道题(Sort):发现与网上的其他高手使用完全相同的方法,使用scanf及printf的代码提交后Accepted,而使用cin及cout的却Time Limit Exceeded,代码如下:代码一(Accepted):#include&lt;...原创 2018-05-26 18:16:02 · 4496 阅读 · 0 评论 -
pthread_join和pthread_detach
转载自:http://blog.csdn.net/u014774781/article/details/48039441 在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死。在被其他线程回收之前,它的存储器资源(例如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自...转载 2018-02-25 15:37:40 · 133 阅读 · 0 评论 -
IP路由
IP协议的一个核心任务是数据报的路由, 即决定发送数据报到目标机器的路径。 IP模块基本工作流程: 当IP模块接收到来自数据链路层的IP数据报时,它首先对该数据报的头部做CRC校验,确认无误之后分析其头部的具体信息。如果该数据报的头部设置了源站选路选项(松散源路由选择或严格源路由选择),则IP模块调用数据报转发子模块来处理该数据报,如果该IP数据报的头部中目标IP地址是本机的某个I原创 2018-02-05 12:16:16 · 326 阅读 · 0 评论 -
IP分片
当IP数据报的长度超过帧的MTU时,它将被分片传输。分片可能发生在发送端,也可能发生在中转路由器上,而且可能在传输过程中被多次分片,但只有在最终的目标机器上,这些分片才会被内核中的IP模块重新组装。 IP头部中的数据报标识、标志和片偏移给IP的分片和重组提供了足够的信息。一个IP数据报的每个分片都具有自己的IP头部,它们具有相同的标识值,但是具有不同的片偏移。并且除了最后一个分片外,其他分片都将原创 2018-02-04 22:17:40 · 383 阅读 · 0 评论 -
Shell脚本语言
shell 是一个编程语言解释器,这个解释器解释从键盘输入的命令,也解释存储在脚本中的命令序列。shell 脚本是一个包含一系列命令的文件。运行一个脚本就是运行这个文件中的每个命令。可以用一个 shell 脚本在一次请求中来执行多个命令。1.sh 的编程特征:变量、 1/0 和 if.. thenshell 脚本是真正的程序。脚本中除了命令之外还包括以下元素。(1)变量脚本原创 2018-01-27 15:08:28 · 432 阅读 · 0 评论 -
信号
用户输入Ctrl-C后发生的事件:(1)用户输入Ctrcl-C(2)驱动程序收到字符(3)匹配VINTR和ISIG的字符被开启(VINTR(003, ETX, Ctrl-C, or also 0177, DEL, rubout)中断字符。发出 SIGINT 信号。当设置ISIG时可被识别,不再作为输入传递。ISIG:当接受到字符 INTR, QUIT, SUSP, 或 DSUSP时原创 2018-01-25 00:00:12 · 229 阅读 · 0 评论 -
进程
一个程序是存储在文件中的机器指令序列,一般它是由编译器将源代码编译成二进制格式的代码。运行一个程序意味着将这个机器指令序列载入内存然后让处理器(cpu)逐条执行这些指令。一个可执行程序是一个机器指令机器及其数据的序列,一个进程是程序运行时的内存空间和设置。利用 ps -a查看进程,S列的值为R说明ps对应的进程正在运行。S列值是S说明进程正在睡眠状态,标记为PRI和NI的列分别是进程的优先级和原创 2018-01-27 00:43:36 · 259 阅读 · 0 评论 -
文件和目录在存储的存储结构
文件系统的三个区域分别为:(1)超级块(2)i-节点表(3)数据区超级块存放文件系统本身的结构信息。i-节点表存放文件本身的属性(*i-节点在文件系统中的位置是固定的,序号从0开始)。数据区存放文件的内容。创建文件的过程: (1)、内核先找到一个空的i节点。将文件属性存储在i节点中 (2)、将文件的内容存在数据块中。 (3)、将文件内容在数据块中的序号按文件内容的先后顺序存原创 2018-01-24 12:56:37 · 4175 阅读 · 0 评论 -
关于文件和目录的简单操作(二)
图片来自:Unix Linux编程实践教程readdir 返回的struct dirent类型结构体struct dirent{ino_t d_ino; //索引号%ldoff_t d_off;//在目录文件中的偏移量 %ldunsigned short d_reclen;//这个记录的长度%uunsigned char d_type;//文原创 2018-01-21 19:06:08 · 204 阅读 · 0 评论 -
进程间通信
select 同时监视多个文件描述符。在指定情况发生的时候,函数返回。详细一点说, select 监昕在三组文件描述符上发生的事件:检查第一组是否可以读取,检查第二组是否可以写入,检查第三组是否有异常发生。每一组的文件描述符被记录到一个二进制位的数组中。这里的 numfds 恰好等于需要监昕的最大的文件描述符加 1 。 使用文件的IPC: 访问控制:客户端必须能够读取文件。通过使用标准文件访原创 2018-01-30 22:10:31 · 121 阅读 · 0 评论 -
epoll
epoll API执行一个类似的任务来poll:监视多个文件描述符来查看是否有任何I / O是可能的。 epoll API既可以用作edge-triggered的接口,也可以用作Level-triggered 的接口,并可以很好地扩展到大量的观察文件描述符。 提供以下系统调用来创建和管理epoll实例: * epoll_create创建一个epoll实例并返回一个引用该实例的文件原创 2018-02-03 14:40:53 · 220 阅读 · 0 评论 -
I/O重定向
文件描述符:一个数组的索引号,每个进程都有其打开的一组文件,这些打开的文件被保持在一个数组中,文件描述符即为某文件在此数组中的索引号。最低文件描述符:当打开文件时,为此文件安排的描述符总是此数组中最低可用位置的索引。三种将标准输入定位到文件的方法: 1、close-then-open策略:这种技术类似于挂断电话释放 一 条线路,然后再将电话拎起从而得到另一条线路 。开始的时候,系统中采原创 2018-01-27 16:57:32 · 149 阅读 · 0 评论 -
管道 的实现
匿名管道:调用 pip e 来创建管道并将其两端连接到两个文件描述符 。 pepefd[0] 为读数据端的文件描述符,而 pipefd[1] 则为写数据端的文件描述符 。 像一个打开的文件的内部情况一样,管道的内部实现隐藏在内核中,进程只能看见两个文件描述符 。pipe 调用也使用最低可用文件描述符。当进程创建一个管道之后,该进程就有了连向管道两端的连接。当这个进程调用 fork的时候原创 2018-01-27 18:14:07 · 346 阅读 · 0 评论 -
基于数据报 (Datagram) 的编程:(UDP)
软件控制 程序的运行需要内存、 CPU 和一些系统资源。操作系统关心这类事情,但是一些程序还需要关心另一件事情:就是程序拥有者的允许。 从合法性的角度讲,需要有一个许可证来保证程序的合法运行,但是有些许可证却是带有限制的。 一种实施许可证技术是编写程序来执行许可证控制。通常的做法是设计从一个许可证服务器获得许可的应用程序。该服务器是一个进程,它授权应用程序的运行。 许可证服务器。程序不是从原创 2018-01-28 18:32:45 · 1022 阅读 · 0 评论 -
IP协议
IP协议是TCP/IP协议族的核心协议,也是socket网络编程的基础之一。IP头部信息。IP头部信息出现在每个IP数据报中,用于指定IP通信的源端IP地址、目的端IP地址,直到IP分片和重组,以及指定部分通信行为。IP数据报的路由和转发,IP数据报的路由和转发发生在除目标机器之外的所有主机和路由上,它们决定数据报是否应该转发以及如何转发。IP协议是TCP/IP协议族的动力,它为上层协原创 2018-02-04 19:01:04 · 309 阅读 · 0 评论 -
socket和TCP/IP协议族的关系
数据链路层、网络层、传输层协议是在内核中实现的,因此操作系统需要实现一组系统调用,使得应用程序能够访问这些协议提供的服务,实现这组系统调用的API有socket,socket与TCP/IP协议族的关系: 由socket定义的一组API提供两点功能:一是将应用程序数据从用户缓冲区中复制到TCP/UDP内核发送缓冲区以交付内核来发送数据,或者是从内核TCP/UDP接收缓冲区中复制数据到用户缓冲区原创 2018-02-04 17:42:42 · 317 阅读 · 0 评论 -
Linux下访问DNS服务
要访问DNS服务,就必须先知道DNS服务器的IP地址。Linux使用/etc/resolve.conf文件来存放DNS服务器的IP地址。 其中注释的意思是:由resolvconf生成的glibc resolver的动态resolv.conf不要用手编辑这个文件 - 你的变化将被覆盖其中两个IP地址分别是首选DNS服务器的地址和备选DNS服务器的地址。 Linux下一个常用的访问原创 2018-02-04 17:06:02 · 666 阅读 · 0 评论 -
DNS工作原理
我们通常使用机器的域名来访问这台机器,而不直接使用其IP地址。在访问的过程中,将机器的域名转换为IP地址可以使用域名查询服务,域名查询服务有很多种实现方式,比如NIS、DNS和本地静态文件等。DNS查询和应答报文详解 DNS是一套分布式的域名服务系统。每个DNS服务器上存放着大量的机器名和IP地址的映射,并且是动态更新的,众多网络客户端程序都使用DNS协议来向DNS服务器查询目标主机的IP地原创 2018-02-04 16:07:25 · 279 阅读 · 0 评论 -
客户/服务器模型(二):模块化
基于 socket 的客户/服务器系统大多是类似的。虽然电子邮件、文件传输、远程登录和分布式数据库,以及其他的 Internet 服务在屏幕上显示的内容相异,但是它们的运作原理是一致的。一旦理解了一个 socket 流的客户/服务器系统,就可以理解大多数其他的系统。 客户连接到服务器,然后发送、接受或者交换数据,最后退出。该交互过程中主要包含了以下 3 个操作: (1)服务器设立服务。 (2原创 2018-01-28 12:11:04 · 298 阅读 · 0 评论 -
远程访问服务器目录
1、设计 三个需要: (1).协议 (2)客户端程序 (3)服务器端程序 2、协议 协议包含有请求和应答。首先,客户端发送一行包含有目录名称的请求。服务器读取该目录名之后打开并读取该目录,然后把文件列表发送到客户端。客户端循环地读取文件列表,直到服务器挂断连接产生文件结尾标志。 3、 客户端程序#include#include#include#include#includ原创 2018-01-28 10:53:32 · 1973 阅读 · 0 评论