<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[XMJYever的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/XMJYever</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; XMJYever]]></copyright><item><title><![CDATA[webrtc学习文章]]></title><link>https://blog.youkuaiyun.com/XMJYever/article/details/125759255</link><guid>https://blog.youkuaiyun.com/XMJYever/article/details/125759255</guid><author>XMJYever</author><pubDate>Wed, 13 Jul 2022 10:50:40 +0800</pubDate><description><![CDATA[webrtc分析好文汇总]]></description><category></category></item><item><title><![CDATA[WebRtc建立P2P链接的总体流程]]></title><link>https://blog.youkuaiyun.com/XMJYever/article/details/124453918</link><guid>https://blog.youkuaiyun.com/XMJYever/article/details/124453918</guid><author>XMJYever</author><pubDate>Wed, 27 Apr 2022 16:20:52 +0800</pubDate><description><![CDATA[前言
最近项目需要了解下webrtc，网上webrtc的资料层出不穷，大多都是过时的描述。个人在这方面也走了不少弯路，为了方便自己后续的工作，将自己阅读代码的所得进行了总结。鉴于个人水平有限，错误在所难免，敬请指正不甚感激！ 
WebRtc简介 
webrtc是Web Real-Time Communication的缩写，google收购Global IP Solutions公司而获得的一项技术，用来实现浏览器与浏览器或者浏览器与本地应用的视频通话标准，也可以用来实现文件共享等功能！后来谷歌推广成了一套W3]]></description><category></category></item><item><title><![CDATA[同步I/O，异步I/O的理解]]></title><link>https://blog.youkuaiyun.com/XMJYever/article/details/111560976</link><guid>https://blog.youkuaiyun.com/XMJYever/article/details/111560976</guid><author>XMJYever</author><pubDate>Tue, 22 Dec 2020 17:05:11 +0800</pubDate><description><![CDATA[文章目录什么是I/O？一、阻塞I/O二、非阻塞I/O三.多路复用I/O四.异步I/O五.阻塞I/O与非阻塞I/O的区别六.同步与异步I/O的区别七.异步IO与非阻塞IO的区别总结

什么是I/O？
I/O：在计算机中指Input/Output,就是输入和输出。由于程序和运行时数据是在内存中驻留，由cpu来执行，涉及到数据交换的地方，通常是磁盘、网卡等，就需要IO接口。
一、阻塞I/O

当用户线程发起IO请求后，会进行系统调用（system call）来让内核（Kernel）进行IO操作（系统调用是用户空.]]></description><category></category></item><item><title><![CDATA[C++为什么要引入typename]]></title><link>https://blog.youkuaiyun.com/XMJYever/article/details/110313452</link><guid>https://blog.youkuaiyun.com/XMJYever/article/details/110313452</guid><author>XMJYever</author><pubDate>Sun, 29 Nov 2020 15:47:57 +0800</pubDate><description><![CDATA[文章目录前言typename的常见用法typename的来源一些关键概念限定名和非限定名依赖名和非依赖名类作用域引入typename的真实原因一个例子问题浮现千呼万唤始出来不同编译器对错误情况的处理使用`typename`的规则其它例子再看常见用法

前言
最近在看STL源码，然后看到迭代器中有如下代码：
tempalte&lt;typename I&gt;
struct iterator_traits
{
    typedef typename I::iterator_category  iterato]]></description><category></category></item><item><title><![CDATA[二叉树前序、中序、后续遍历递归和非递归C++实现（带详细注释）]]></title><link>https://blog.youkuaiyun.com/XMJYever/article/details/109718034</link><guid>https://blog.youkuaiyun.com/XMJYever/article/details/109718034</guid><author>XMJYever</author><pubDate>Mon, 16 Nov 2020 11:44:36 +0800</pubDate><description><![CDATA[实现代码如下，带有详细注释：
#include &lt;iostream&gt;
#include &lt;stack&gt;
// 定义的树结构体
struct TreeNode{
    int val;
    TreeNode* leftTree;
    TreeNode* rightTree;
};

/* 二叉树的先序遍历，递归方法 */
void preOrder(TreeNode* root)
{
    if(root != nullptr)
    {
        cout &lt]]></description><category></category></item><item><title><![CDATA[bitCount函数详解]]></title><link>https://blog.youkuaiyun.com/XMJYever/article/details/109594462</link><guid>https://blog.youkuaiyun.com/XMJYever/article/details/109594462</guid><author>XMJYever</author><pubDate>Tue, 10 Nov 2020 12:31:51 +0800</pubDate><description><![CDATA[最近刷题的时候看到了这样一个奇怪的函数，一开始非常不理解，后来查阅了资料，现将它记录下来。
int bitCount(int i) {
      // HD, Figure 5-2
       i = i - ((i &gt;&gt;&gt; 1) &amp; 0x55555555);
       i = (i &amp; 0x33333333) + ((i &gt;&gt;&gt; 2) &amp; 0x33333333);
       i = (i + (i &gt;&gt;&gt; 4)) &]]></description><category></category></item><item><title><![CDATA[Linux命令速查汇总]]></title><link>https://blog.youkuaiyun.com/XMJYever/article/details/109044699</link><guid>https://blog.youkuaiyun.com/XMJYever/article/details/109044699</guid><author>XMJYever</author><pubDate>Tue, 13 Oct 2020 09:57:24 +0800</pubDate><description><![CDATA[1. 查看Linux系统信息
arch      #显示机器的处理器架构(1)
uname -m  #显示机器的处理器架构(2)
uname -r  #显示正在使用的内核版本
dmidecode -q          #显示硬件系统部件 - (SMBIOS / DMI)
hdparm -i /dev/hda    #罗列一个磁盘的架构特性
hdparm -tT /dev/sda   #在磁盘上执行测试性读取操作
cat /proc/cpuinfo     #显示CPU info的信息
cat /proc/]]></description><category></category></item><item><title><![CDATA[epoll使用详解（精髓）]]></title><link>https://blog.youkuaiyun.com/XMJYever/article/details/108843880</link><guid>https://blog.youkuaiyun.com/XMJYever/article/details/108843880</guid><author>XMJYever</author><pubDate>Mon, 28 Sep 2020 10:08:05 +0800</pubDate><description><![CDATA[epoll - I/O event notification facility
在linux的网络编程中，很长的时间都在使用select来做事件触发。在linux新的内核中，有了一种替换它的机制，就是epoll。
相比于select，epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中，它是采用轮询来处理的，轮询的fd数目越多，自然耗时越多。并且，在linux/posix_types.h头文件有这样的声明：
#define __FD_SETSIZE    1024]]></description><category></category></item><item><title><![CDATA[进程间通信——共享内存]]></title><link>https://blog.youkuaiyun.com/XMJYever/article/details/108797248</link><guid>https://blog.youkuaiyun.com/XMJYever/article/details/108797248</guid><author>XMJYever</author><pubDate>Fri, 25 Sep 2020 15:13:59 +0800</pubDate><description><![CDATA[什么是共享内存
共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式，允许两个不相关的进程访问同一逻辑内存。
共享内存是由IPC为进程创建的一个特殊的地址范围，它将出现在该进程的地址空间中。其他进程可以将同一段共享内存连接到它们自己的地址空间中。
所有的进程都以访问共享内存中的地址，就像它们是由malloc分配的一样。如果某个进程向共享内存写入了数据，所做的改动将立刻被可以访问同一段共享内存的任何其他进程看到。
一般使用共享内存来提供对大块内存区域的有效访问，同时通过传递小消息来同步对该内存的访问]]></description><category></category></item><item><title><![CDATA[Linux进程通信——信号量semget()、semop()、semctl()]]></title><link>https://blog.youkuaiyun.com/XMJYever/article/details/108781969</link><guid>https://blog.youkuaiyun.com/XMJYever/article/details/108781969</guid><author>XMJYever</author><pubDate>Thu, 24 Sep 2020 20:11:02 +0800</pubDate><description><![CDATA[前言
如果有多个程序试图在同一时间更新这个数据库，数据就可能会遭到破坏。两个不同的程序要求不同的用户向数据库输入数据，问题会出现在对数据库进行更新的代码上。
临界区域：真正执行数据更新的代码需要独占式的执行。为了防止出现因多个程序同时访问一个共享资源而引发的问题，则需要使用一种方法，可以通过生成并使用令牌来授权，在任一时刻只能有一个执行线程访问代码的临界区域。
之前说过可以使用互斥量和信号量来控制对临界区域的访问。
在此会对信号量做更加普遍意义的介绍。
定义
信号量：是一个特殊变量，只允许对它进行等待（wa]]></description><category></category></item><item><title><![CDATA[Linux下实现简易客户/服务器(C/S)应用程序——基于有名管道FIFO]]></title><link>https://blog.youkuaiyun.com/XMJYever/article/details/108653814</link><guid>https://blog.youkuaiyun.com/XMJYever/article/details/108653814</guid><author>XMJYever</author><pubDate>Fri, 18 Sep 2020 10:50:59 +0800</pubDate><description><![CDATA[有名管道简介

]]></description><category></category></item><item><title><![CDATA[stm32端口复用和重映射简介]]></title><link>https://blog.youkuaiyun.com/XMJYever/article/details/108623174</link><guid>https://blog.youkuaiyun.com/XMJYever/article/details/108623174</guid><author>XMJYever</author><pubDate>Wed, 16 Sep 2020 15:29:08 +0800</pubDate><description><![CDATA[端口复用和重映射都是和单片机的I/O口有关系，端口复用是将一个I/O赋予多个功能，通过设置I/O的工作模式来切换不同的功能。重映射是将某些I/O口上面的功能映射到其他I/O口上面去。但是注意一点：重映射的I/O都是厂家设置好的，不能自己更改。
端口复用
外设
在说端口复用之前先明白一个概念：什么是外设？什么是内置外设？

  外部设备简称“外设”，是指连在计算机主机以外的硬件设备。对数据和信息起着传输、转送和存储的作用，是计算机系统中的重要组成部分。 
                           ]]></description><category></category></item><item><title><![CDATA[Linux下MySQL数据库简介及使用(基于C语言)]]></title><link>https://blog.youkuaiyun.com/XMJYever/article/details/108551054</link><guid>https://blog.youkuaiyun.com/XMJYever/article/details/108551054</guid><author>XMJYever</author><pubDate>Sun, 13 Sep 2020 16:18:44 +0800</pubDate><description><![CDATA[1. MySQL基本简介
1.1 数据库
数据库：database（DB），是一种存储数据的仓库。

数据库是根据数据结构组织、存储和管理数据
数据库能够长期、高效的管理和存储数据
数据库的目的就是能够存储（写）和提供（读）数据

1.2 关系型数据库
关系型数据库是一种建立在关系模型上的数据库。

常见的关系模型有：关系数据结构(存储)、关系操作集合(操作)和关系完整性约束(约束)；
关系型数据库存储在磁盘中(永久性存储)；
关系型数据库模型有四层结构：数据库管理系统、数据库、数据表、数据字段(依赖于数据]]></description><category></category></item><item><title><![CDATA[linux文件操作——基于unix标准库函数(open、read、write函数等)]]></title><link>https://blog.youkuaiyun.com/XMJYever/article/details/108424862</link><guid>https://blog.youkuaiyun.com/XMJYever/article/details/108424862</guid><author>XMJYever</author><pubDate>Sat, 05 Sep 2020 21:28:58 +0800</pubDate><description><![CDATA[1. 前言
在linux系统中，“一切皆文件”这一观点非常重要，也就是说无论执行什么类型的操作，都可以用 “打开 open-&gt;读写 read/write-&gt;关闭 close”模式来操作。
大多数情况下，我们只需要使用五个基本的库函数——open、close、read、write和ioctl。
2. Linux文件结构
2.1目录
目录除了本身包含的内容外，还会有一个名字和一些属性，即“管理信息”，例如：利用ls -l在当前目录下执行，可以得到如下图所示
[外链图片转存失败,源站可能有防盗链机制,]]></description><category></category></item><item><title><![CDATA[Linux重定向详解(输入输出重定向)]]></title><link>https://blog.youkuaiyun.com/XMJYever/article/details/108303678</link><guid>https://blog.youkuaiyun.com/XMJYever/article/details/108303678</guid><author>XMJYever</author><pubDate>Sun, 30 Aug 2020 11:20:39 +0800</pubDate><description><![CDATA[前言
首先需要明确的一点，Linux 中标准的输入设备默认指的是键盘\color{red}{键盘}键盘，标准的输出设备默认指的是显示器\color{red}{显示器}显示器。
所以所说的输入、输出重定向，从字面理解，即：

输入重定向：指的是重新指定设备来代替键盘\color{blue}{代替键盘}代替键盘作为新的输入设备；
输出重定向：指的是重新指定设备来代替显示器\color{blue}{代替显示器}代替显示器作为新的输出设备。

通常是用文件或命令的执行结果来代替键盘作为新的输入设备，而新的输出设备通]]></description><category></category></item><item><title><![CDATA[led裸机程序Makefile制作，arm-linux-(gcc/ld/objcopy/objdump)详解]]></title><link>https://blog.youkuaiyun.com/XMJYever/article/details/108248249</link><guid>https://blog.youkuaiyun.com/XMJYever/article/details/108248249</guid><author>XMJYever</author><pubDate>Wed, 26 Aug 2020 21:49:55 +0800</pubDate><description><![CDATA[在linux中输入vi Makefile 来实现创建Makefile文件
**命令行前必须加TAB键
对于led裸机程序，主要是将两个文件led.c和start.S汇编文件，制作一个Makefile文件
makefile文件如下(引自迅为iTOP给的例程)：
// 下面会详解
led.bin: start.o led.o
	arm-none-linux-gnueabi-ld -Ttext 0x0 -o led.elf $^
	arm-none-linux-gnueabi-objcopy -O binary ]]></description><category></category></item><item><title><![CDATA[RT-Thread系统启动过程，非常详细，通俗易懂！！！]]></title><link>https://blog.youkuaiyun.com/XMJYever/article/details/108106312</link><guid>https://blog.youkuaiyun.com/XMJYever/article/details/108106312</guid><author>XMJYever</author><pubDate>Wed, 19 Aug 2020 21:44:42 +0800</pubDate><description><![CDATA[接触RT-Thread有一段时间了，之前一段时间学习了RT-Thread内核方面的知识，但总归有点走马观花的意思，没仔细琢磨，就略过了。今天开始打算将RT-Thread系统重新温习一遍，对操作系统有更深刻的理解。
话不多说，接下来将讲述RT-Thread的系统启动流程。(RT-Thread官方已经给了比较详细的教程，所以在此主要添加一些自己的理解)
在开始之前，需要准备必须的工具，准备工具：keil、RT-Thread 官方提供的软件仿真例程
启动流程概述
在讲解之前，先上rt-thread系统启动的主体步]]></description><category></category></item><item><title><![CDATA[secureCRT安装、连接系统终端以及设置长时间连接不断开 详解！！！]]></title><link>https://blog.youkuaiyun.com/XMJYever/article/details/108036066</link><guid>https://blog.youkuaiyun.com/XMJYever/article/details/108036066</guid><author>XMJYever</author><pubDate>Sun, 16 Aug 2020 14:50:57 +0800</pubDate><description><![CDATA[安装
在此分享secureCRT安装包（里面包含两个软件，secureCRT和secureFX，可以选择都安装）
点击此处
提取码：yav3
安装步骤可以参考这篇博客，讲的很详细,在此就不赘述了。
软件破解

需要提醒的一点，对于软件破解，找到解压文件中的crack文件夹，如下图所示：

点开crack文件夹，如下图所示：

将keygen文件复制到secureCRT安装目录中

打开kegen应用程序

点击左下角的patch按钮，选择SecureCRT，点击打开

然后会继续弹出对话框，选择Licens]]></description><category></category></item><item><title><![CDATA[C语言保留字（关键字）汇总——转载]]></title><link>https://blog.youkuaiyun.com/XMJYever/article/details/107975698</link><guid>https://blog.youkuaiyun.com/XMJYever/article/details/107975698</guid><author>XMJYever</author><pubDate>Thu, 13 Aug 2020 11:37:02 +0800</pubDate><description><![CDATA[由于是温习笔记，写的内容比较杂，比较基础。主要是写给自己看的，方便以后查阅。今天来讲讲c中的保留字。保留字(reserved word)　　保留字又称关键字。　　指在高级语言中已经定义过的字，使用者不能再将这些字作为变量名或过程名使用。　　每种程序设计语言都规定了自己的一套保留字。　　例如：BASIC语言规定不能使用LIST作为变量名或...]]></description><category></category></item><item><title><![CDATA[LWIP协议栈之TCP建立与断开(三次握手、四次挥手)]]></title><link>https://blog.youkuaiyun.com/XMJYever/article/details/107939245</link><guid>https://blog.youkuaiyun.com/XMJYever/article/details/107939245</guid><author>XMJYever</author><pubDate>Tue, 11 Aug 2020 16:58:00 +0800</pubDate><description><![CDATA[简介
TCP叫传输控制协议，它为上层提供一种面向连接的、可靠的字节流服务。
面向连接意味着两个使用TCP的应用（通常是一个客户和一个服务器）在彼此交换数据之前必须先简历一个TCP连接。
在一个TCP连接中，仅有两方进行彼此通信，广播和多播不能用于TCP。
TCP的服务
TCP通过下列方式来提供可靠性：

应用数据被分割成TCP认为最适合发送的数据块；
当TCP发出一个段后，它起动一个定时器，等待目的端确认收到这个报文段。如果不能，将重发这个报文段。
当TCP收到发自TCP连接另一端的数据，它将发送一个确认。]]></description><category></category></item></channel></rss>