<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[侯彩桦]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/sinat_28697845</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; sinat_28697845]]></copyright><item><title><![CDATA[闲鱼监控软件]]></title><link>https://blog.youkuaiyun.com/sinat_28697845/article/details/134607328</link><guid>https://blog.youkuaiyun.com/sinat_28697845/article/details/134607328</guid><author>sinat_28697845</author><pubDate>Fri, 24 Nov 2023 21:27:31 +0800</pubDate><description><![CDATA[闲鱼监秒拍控软件可以根据您的需求，在您设定的价格范围内监控货架上的产品，相当于一个筛选闲鱼信息的工具，可以帮助您准确锁定卖家，尤其是专门做闲鱼生意的卖家。当你设定的目标出现时，它会帮助你自动抢购，让你再也不用担心低价好卖的产品被抢占。闲鱼监控助手是一款闲鱼出品的多关键字搜索工具应用。这个应用总体还是挺有用的，在闲鱼上找二手其实也挺有意思的。闲鱼监控助手可以方便的添加你想要关注的闲鱼内容，自动帮你搜索。给老婆做了个闲鱼价格监控，当价格发生波动时自动邮件通知。用微信的邮件提醒可以直接查看追踪。]]></description><category></category></item><item><title><![CDATA[Mac App 不发布App Store 网页下载安装公证流程，解决不提示“来自身份不明开发者”]]></title><link>https://blog.youkuaiyun.com/sinat_28697845/article/details/132582111</link><guid>https://blog.youkuaiyun.com/sinat_28697845/article/details/132582111</guid><author>sinat_28697845</author><pubDate>Wed, 30 Aug 2023 14:41:18 +0800</pubDate><description><![CDATA[不公证的话，用户安装app，会提示来自不明开发者，需要按住ctrl +双击才能打开程序。Mac app 公证。]]></description><category></category></item><item><title><![CDATA[TCP多进程并发服务器与单进程客户端（简单回声）echo clinet]]></title><link>https://blog.youkuaiyun.com/sinat_28697845/article/details/132110379</link><guid>https://blog.youkuaiyun.com/sinat_28697845/article/details/132110379</guid><author>sinat_28697845</author><pubDate>Fri, 04 Aug 2023 18:32:08 +0800</pubDate><description><![CDATA[【代码】TCP多进程并发服务器与单进程客户端（简单回声）echo clinet。]]></description><category></category></item><item><title><![CDATA[TCP单进程循环服务器与单进程客户端（简单回声）echo server]]></title><link>https://blog.youkuaiyun.com/sinat_28697845/article/details/132109999</link><guid>https://blog.youkuaiyun.com/sinat_28697845/article/details/132109999</guid><author>sinat_28697845</author><pubDate>Fri, 04 Aug 2023 18:17:43 +0800</pubDate><description><![CDATA[【代码】TCP单进程循环服务器与单进程客户端（简单回声）echo server。]]></description><category></category></item><item><title><![CDATA[muduo网络库示例（高效率多线程异步日志）]]></title><link>https://blog.youkuaiyun.com/sinat_28697845/article/details/123113687</link><guid>https://blog.youkuaiyun.com/sinat_28697845/article/details/123113687</guid><author>sinat_28697845</author><pubDate>Thu, 24 Feb 2022 22:01:42 +0800</pubDate><description><![CDATA[多线程程序日志库要求

线程安全，即多个线程可以并发写日志，两个线程的日志消息不会出现交织。

线程1写入：ABCDEFG，线程2写入 abcdefg。出现ABCDabcEFGdefg 这就是出现交织。

用一个全局的mutex保护IO，全局mutex 会造成全部线程抢占一个锁。相当于所有并发写的线程变成了串行



每个线程单独写一个日志文件。这种情况有可能让业务线程阻塞在写磁盘操作上。写磁盘操作相对来说耗时，就会出现写业务线程阻塞在写操作上面，影响业务线程的并发能力

muduo库采用的办法是：用一个背]]></description><category></category></item><item><title><![CDATA[muduo网络库示例 （限制并发数和踢掉空闲连接）]]></title><link>https://blog.youkuaiyun.com/sinat_28697845/article/details/123109863</link><guid>https://blog.youkuaiyun.com/sinat_28697845/article/details/123109863</guid><author>sinat_28697845</author><pubDate>Thu, 24 Feb 2022 15:41:56 +0800</pubDate><description><![CDATA[限制服务器最大并发连接数

（MuduoManual.pdf P108）

这个比较简单，在连接里面判断最大数量断开连接。


void EchoServer::onConnection(const TcpConnectionPtr&amp; conn)
{
  LOG_INFO &lt;&lt; "EchoServer - " &lt;&lt; conn-&gt;peerAddress().toIpPort() &lt;&lt; " -&gt; "
           &lt;&lt; conn-&gt]]></description><category></category></item><item><title><![CDATA[muduo网络库示例（聊天服务器）]]></title><link>https://blog.youkuaiyun.com/sinat_28697845/article/details/123103909</link><guid>https://blog.youkuaiyun.com/sinat_28697845/article/details/123103909</guid><author>sinat_28697845</author><pubDate>Thu, 24 Feb 2022 11:30:39 +0800</pubDate><description><![CDATA[聊天服务器（MuduoManual.pdf P66）

examples/asio/chat/server.cc 单线程

examples/asio/chat/server_threaded.cc，多线程TcpServer，并用mutex来保护共享数据mutex

examples/asio/chat/server_threaded_efficient.cc,借shared_ptr实现copy-on-write的手法来降低锁竞争

examples/asio/chat/server_threaded_hi]]></description><category></category></item><item><title><![CDATA[muduo库http源码分析]]></title><link>https://blog.youkuaiyun.com/sinat_28697845/article/details/123087767</link><guid>https://blog.youkuaiyun.com/sinat_28697845/article/details/123087767</guid><author>sinat_28697845</author><pubDate>Wed, 23 Feb 2022 14:54:46 +0800</pubDate><description><![CDATA[http request

HTTP请求包含：request line + header + body （header分为普通报头，请求报头与实体报头） header与body之间有一空行（CRLF）

请求方法有： Get, Post, Head, Put, Delete等 协议版本1.0、1.1

常用请求头

Accept：浏览器可接受的媒体（MIME）类型；

Accept-Language：浏览器所希望的语言种类

Accept-Encoding：浏览器能够解码的编码方法，如gzip，deflat]]></description><category></category></item><item><title><![CDATA[muduo库net源码分析十三（tcp客户端的支持）]]></title><link>https://blog.youkuaiyun.com/sinat_28697845/article/details/123083806</link><guid>https://blog.youkuaiyun.com/sinat_28697845/article/details/123083806</guid><author>sinat_28697845</author><pubDate>Wed, 23 Feb 2022 11:36:07 +0800</pubDate><description><![CDATA[Connector 主动发起连接

带有自动重连功能


#ifndef MUDUO_NET_CONNECTOR_H
#define MUDUO_NET_CONNECTOR_H

#include &lt;muduo/net/InetAddress.h&gt;

#include &lt;boost/enable_shared_from_this.hpp&gt;
#include &lt;boost/function.hpp&gt;
#include &lt;boost/noncopyable.hpp&gt]]></description><category></category></item><item><title><![CDATA[muduo库net源码分析十二（完善TcpConnection）]]></title><link>https://blog.youkuaiyun.com/sinat_28697845/article/details/123082414</link><guid>https://blog.youkuaiyun.com/sinat_28697845/article/details/123082414</guid><author>sinat_28697845</author><pubDate>Wed, 23 Feb 2022 10:04:40 +0800</pubDate><description><![CDATA[增加WriteCompleteCallback

应用层缓冲区数据全部发送到内核缓冲区后，回调WriteCompleteCallback，以使应用层发送更多的数据。

对于大流量的应用才需要关注，大流量不断生成数据，然后发送conn-&gt;send()，如果对等方接收不及时，收到通告窗口的控制，内核发送缓冲不足，这个时候就会将用户数据添加到应用层发送缓冲区（output buffer）,可能会撑爆output buffer。解决办法就是，调增发送频率，关注WriteCompleteCallback 回调，]]></description><category></category></item><item><title><![CDATA[muduo库net源码分析十一（应用层缓冲区Buffer设计）]]></title><link>https://blog.youkuaiyun.com/sinat_28697845/article/details/123071372</link><guid>https://blog.youkuaiyun.com/sinat_28697845/article/details/123071372</guid><author>sinat_28697845</author><pubDate>Tue, 22 Feb 2022 23:08:30 +0800</pubDate><description><![CDATA[为什么需要有应用层缓冲区？

muduo网络库使用IO复用，并且文件描述符使用非阻塞模式，如果使用阻塞模式那么read、write就会阻塞在这些系统调用之上，这样一来即使其他文件描述符的IO到来也不能立刻去处理，也就不能最大限度的使用IO线程。

考虑一个常见场景:程序想通过 TCP 连接 发送 100k 字节的数据，但是在 write() 调用中，操作系统只接受了 80k 字节(受 TCP advertised window 的控制，细节见 TCPv1)，你肯定不想在原地等待，因为不知道 会等多久(取决于]]></description><category></category></item><item><title><![CDATA[muduo库net源码分析十（muduo库如何支持多线程）]]></title><link>https://blog.youkuaiyun.com/sinat_28697845/article/details/123069083</link><guid>https://blog.youkuaiyun.com/sinat_28697845/article/details/123069083</guid><author>sinat_28697845</author><pubDate>Tue, 22 Feb 2022 15:50:25 +0800</pubDate><description><![CDATA[muduo库如何支持one loop per thread

由以下类实现

EventLoopThread（IO线程类）

EventLoopThreadPool（IO线程池类）

IO线程池的功能是开启若干个IO线程，并让这些IO线程处于事件循环的状态


#ifndef MUDUO_NET_EVENTLOOPTHREADPOOL_H
#define MUDUO_NET_EVENTLOOPTHREADPOOL_H

#include &lt;muduo/base/Condition.h&gt;
#inc]]></description><category></category></item><item><title><![CDATA[muduo库net源码分析九（TcpConnection生存期管理）]]></title><link>https://blog.youkuaiyun.com/sinat_28697845/article/details/123066113</link><guid>https://blog.youkuaiyun.com/sinat_28697845/article/details/123066113</guid><author>sinat_28697845</author><pubDate>Tue, 22 Feb 2022 15:07:54 +0800</pubDate><description><![CDATA[第5步，在TcpSever中removeConnection 移除掉TcpConnection, 正常应该在移除后销毁掉TcpConnection，但是不能销毁，如果现在销毁了TcpConnection的Channel对象也就跟着销毁了 ，而这时调用Channel的handleEvent() 函数，就会出现core down，所以说TcpConnection 的生命期应该长于Cannel对象。

当连接到来，创建一个TcpConnection对象，立刻用share_ptr 来管理，引用计数为1，

在C..]]></description><category></category></item><item><title><![CDATA[muduo库net源码分析八（TcpServer/TcpConnection）]]></title><link>https://blog.youkuaiyun.com/sinat_28697845/article/details/123064474</link><guid>https://blog.youkuaiyun.com/sinat_28697845/article/details/123064474</guid><author>sinat_28697845</author><pubDate>Tue, 22 Feb 2022 11:50:59 +0800</pubDate><description><![CDATA[Acceptor类的主要功能是socket、bind、listen 一般来说，在上层应用程序中，我们不直接使用Acceptor，而是把它作为TcpServer的成员 TcpServer还包含了一个TcpConnection列表 TcpConnection与Acceptor类似，有两个重要的数据成员，Socket与Channel。






#ifndef MUDUO_NET_TCPSERVER_H
#define MUDUO_NET_TCPSERVER_H

#include &lt;muduo/bas.]]></description><category></category></item><item><title><![CDATA[muduo库net源码分析七（Socket 封装）]]></title><link>https://blog.youkuaiyun.com/sinat_28697845/article/details/123063045</link><guid>https://blog.youkuaiyun.com/sinat_28697845/article/details/123063045</guid><author>sinat_28697845</author><pubDate>Tue, 22 Feb 2022 10:52:31 +0800</pubDate><description><![CDATA[Acceptor用于accept(2)接受TCP连接

Acceptor的数据成员包括Socket、Channel，Acceptor的socket是listening socket（即server socket）。Channel用于观察此socket的readable事件，并回调Accptor::handleRead()，后者调用accept(2)来接受新连接，并回调用户callback。

Acceptor 示例



void newConnection(int sockfd, const InetAd]]></description><category></category></item><item><title><![CDATA[muduo库net源码分析六（Socket 封装）]]></title><link>https://blog.youkuaiyun.com/sinat_28697845/article/details/123056462</link><guid>https://blog.youkuaiyun.com/sinat_28697845/article/details/123056462</guid><author>sinat_28697845</author><pubDate>Tue, 22 Feb 2022 10:36:35 +0800</pubDate><description><![CDATA[SocketsOps.h/ SocketsOps.cc

封装了socket相关系统调用（全局函数，位于muduo::net::sockets名称空间中）。

Socket.h/Socket.cc（Socket类）

用RAII方法封装socket file descriptor。

InetAddress.h/InetAddress.cc（InetAddress类）

网际地址sockaddr_in封装

Endian.h

封装了字节序转换函数（全局函数，位于muduo::net::sockets名..]]></description><category></category></item><item><title><![CDATA[muduo库net源码分析五（EventLoopThread 封装）]]></title><link>https://blog.youkuaiyun.com/sinat_28697845/article/details/123051466</link><guid>https://blog.youkuaiyun.com/sinat_28697845/article/details/123051466</guid><author>sinat_28697845</author><pubDate>Mon, 21 Feb 2022 21:22:30 +0800</pubDate><description><![CDATA[为什么要封装EventLoopThread?

任何一个线程，只要创建并运行了EventLoop，都称之为IO线程。

一个程序可以有多个IO线程，因此 IO线程不一定是主线程。

muduo并发模型one loop per thread + threadpool 。一个线程有且只有一个EventLoop，一个程序可以有多个IO线程，这些IO线程可以用IO线程池来管理。这里有两个线程池，一个IO线程池一个计算线程池主要用于计算任务。IO线程也可以执行计算任务，EventLoop中的runInLoop() 可]]></description><category></category></item><item><title><![CDATA[muduo库net源码分析四（线程唤醒）]]></title><link>https://blog.youkuaiyun.com/sinat_28697845/article/details/123046678</link><guid>https://blog.youkuaiyun.com/sinat_28697845/article/details/123046678</guid><author>sinat_28697845</author><pubDate>Mon, 21 Feb 2022 17:11:22 +0800</pubDate><description><![CDATA[线程唤醒方法

一个线程如何通知另一个等待中的线程，可以有三个方法：

1、pipe 管道有一对文件描述符。pipe[0] 对应管道的读端，pipe[1] 对应管道的写端，等待的线程关注pipe[0]的读端，通知线程向pipe[1] 写入数据，pipe[0] 就变的可读了，等待线程获得通知就唤醒线程。

2、socketpair 和管道一样有一对文件描述符，不同的是可以双向通信。

3、eventfd。等待线程监听文件描述符可读事件，通知线程只要往这个线程写入数据，等待线程就会获得通知。是一个比 pipe ]]></description><category></category></item><item><title><![CDATA[muduo库net源码分析三（定时器）]]></title><link>https://blog.youkuaiyun.com/sinat_28697845/article/details/123040554</link><guid>https://blog.youkuaiyun.com/sinat_28697845/article/details/123040554</guid><author>sinat_28697845</author><pubDate>Mon, 21 Feb 2022 14:27:07 +0800</pubDate><description><![CDATA[让EventLoop 能够处理定时器事件

定时函数

用于让程序等待一段时间或安排计划任务：

sleep

alarm usleep

nanosleep

clock_nanosleep

getitimer / setitimer

timer_create / timer_settime / timer_gettime / timer_delete

timerfd_create / timerfd_gettime / timerfd_settime 选择这种方法。

为什么选择timerfd_c]]></description><category></category></item><item><title><![CDATA[muduo库net源码分析二（类之间的关系）]]></title><link>https://blog.youkuaiyun.com/sinat_28697845/article/details/123037464</link><guid>https://blog.youkuaiyun.com/sinat_28697845/article/details/123037464</guid><author>sinat_28697845</author><pubDate>Mon, 21 Feb 2022 09:29:47 +0800</pubDate><description><![CDATA[muduo 网络库相关的类图

白色部分是外部类，对外可见的。灰色部分是内部类，对外不可见。

EventLoop是对事件的抽象

Poller 是对IO 复用的抽象，有两个派生类，PollPoller 对poll 的封装，EPollPoller对epoll的封装 。这个地方是muduo 唯一使用面向对象封装的。

Channel 是对IO事件的注册和响应的封装 。Channel 的Update成员函数负责注册和更新IO的可读可写等事件。Channel 的handleEvent()成员函数是对所发生的IO事]]></description><category></category></item></channel></rss>