<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[ljytower的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/ljytower</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; ljytower]]></copyright><item><title><![CDATA[离线升级docker中的某个镜像——以etcd为例]]></title><link>https://blog.youkuaiyun.com/ljytower/article/details/140212999</link><guid>https://blog.youkuaiyun.com/ljytower/article/details/140212999</guid><author>ljytower</author><pubDate>Fri, 05 Jul 2024 16:43:55 +0800</pubDate><description><![CDATA[5.将etcd和etcdctl移动到和dockerfile同级目录:$ mv etcd-v3.3.10-linux-amd64/etcd etcd-v3.3.10-linux-amd64/etcdctl -t ./【补充说明】可以直接在可以联网的机器中使用docker pull nginx，下载好之后将nginx的镜像导出，在导入到非联网的机器中使用。之前有个项目的程序统一在docker中运行，最近在做安全检查时，发现docker的部分image因为版本没有更新到最新而出现安全漏洞问题。]]></description><category></category></item><item><title><![CDATA[部署过docker后，防火墙firewall与iptables的基本指令]]></title><link>https://blog.youkuaiyun.com/ljytower/article/details/140212865</link><guid>https://blog.youkuaiyun.com/ljytower/article/details/140212865</guid><author>ljytower</author><pubDate>Fri, 05 Jul 2024 16:38:51 +0800</pubDate><description><![CDATA[详情参考：https://blog.youkuaiyun.com/yeqinghanwu/article/details/125979997。如果服务器中部署了docker，优先选用iptables。一、iptables【无需stop docker服务】docker容器与iptables冲突问题。-重启防火墙(修改配置后要重启防火墙)-设置iptables开机自启。-设置开放针对某ip的某端口。-安装iptables。-启动iptables。-关闭docker服务。-开启docker服务。-开启docker服务。]]></description><category></category></item><item><title><![CDATA[SaToken踩坑记录]]></title><link>https://blog.youkuaiyun.com/ljytower/article/details/131228802</link><guid>https://blog.youkuaiyun.com/ljytower/article/details/131228802</guid><author>ljytower</author><pubDate>Thu, 15 Jun 2023 15:31:34 +0800</pubDate><description><![CDATA[使用satoken做权限认证后，无论是做全局的WebMvcConfigurer还是做局部的@CrossOrigin(originPatterns = "http://localhost:8000")都不起作用。使用satoken做权限认证后，knife4j的doc.html页面无法打开。一、与knife4j搭配使用。]]></description><category></category></item><item><title><![CDATA[Cpp-Socket网络编程（十）客户端升级为select网络模型]]></title><link>https://blog.youkuaiyun.com/ljytower/article/details/98315597</link><guid>https://blog.youkuaiyun.com/ljytower/article/details/98315597</guid><author>ljytower</author><pubDate>Sat, 03 Aug 2019 12:28:26 +0800</pubDate><description><![CDATA[1. 在服务器端加入，如果有新用户连接服务器端则向所有连接的客户端发送消息：


if (FD_ISSET(_sock, &amp;fdRead)) {
    FD_CLR(_sock, &amp;fdRead);
    //4. 等待客户端连接accept
    sockaddr_in clientAddr = {};
    socklen_t nAddrLen = sizeof(soc...]]></description><category></category></item><item><title><![CDATA[Cpp-Socket网络编程（九）服务器端升级为非阻塞select模型，处理更多业务]]></title><link>https://blog.youkuaiyun.com/ljytower/article/details/98311616</link><guid>https://blog.youkuaiyun.com/ljytower/article/details/98311616</guid><author>ljytower</author><pubDate>Sat, 03 Aug 2019 10:33:11 +0800</pubDate><description><![CDATA[对于服务器而言，除了响应多个客户端的需求，还需要主动向推送消息，那么就提出了在select() 查询结束后如果没有其他数据可操作，服务器还可以做一些其他工作的需求，因此本篇将服务器端的select模型改造为非阻塞式的。

mac OS环境下，select的声明如下，这里第五个参数代表了查询的超时时间，即查询数据时如果等待了__restrict所定义的时间后还没有数据就立即返回。


int    ...]]></description><category></category></item><item><title><![CDATA[Cpp-Socket网络编程（八）服务器端升级为select模型处理多客户端]]></title><link>https://blog.youkuaiyun.com/ljytower/article/details/97619392</link><guid>https://blog.youkuaiyun.com/ljytower/article/details/97619392</guid><author>ljytower</author><pubDate>Sun, 28 Jul 2019 23:10:17 +0800</pubDate><description><![CDATA[之前学习的服务器端与客户端网络程序都是1对1的阻塞模式的网络程序，每次服务器端想要接收新的客户端连接时，都必须要新的客户端向服务器端发送连接；某一端想要调用recv函数接收数据时也必须要另一段真正的发送数据过来。那么当我们调用这些阻塞函数时，就必须要等待函数执行，不能进行其他的业务处理，服务器端就无法同时处理多个客户端的业务。为了令服务器端能够处理多客户端业务，这里使用select网络模型。

s...]]></description><category></category></item><item><title><![CDATA[Cpp-Socket网络编程（七）网络消息接收长度问题]]></title><link>https://blog.youkuaiyun.com/ljytower/article/details/97534117</link><guid>https://blog.youkuaiyun.com/ljytower/article/details/97534117</guid><author>ljytower</author><pubDate>Sun, 28 Jul 2019 20:55:00 +0800</pubDate><description><![CDATA[在复杂网络环境下，网络消息的长度并不总是固定的，网络数据包可分为固长数据、变长数据、粘包/拆包、少包/组包等情况。其中，粘包指，例如每次发送500字节数据到客户端或者服务端，但是由于网络延迟等原因，服务器端可能一次收到两个消息，即1000字节，也就是网络数据包粘在一起了，因此需要一个拆包的过程；分包指，例如一次发送1000字节数据，服务器端接收的时候，一开始只接收到500字节的数据，那么服务器端就...]]></description><category></category></item><item><title><![CDATA[Cpp-Socket网络编程（六）将多次收发报文数据升级为一次收发]]></title><link>https://blog.youkuaiyun.com/ljytower/article/details/97043352</link><guid>https://blog.youkuaiyun.com/ljytower/article/details/97043352</guid><author>ljytower</author><pubDate>Tue, 23 Jul 2019 22:53:37 +0800</pubDate><description><![CDATA[1. 为命令CMD的枚举增加两个成员：


enum CMD {
    CMD_LOGIN,
    CMD_LOGIN_RESULT，
    CMD_LOGOUT,
    CMD_LOGOUT_RESULT，
    CMD_ERROR
};

2. 使用继承的方式，令Login/Logout/LoginResult/LogoutResult结构体继承于DataHeader，并在Login...]]></description><category></category></item><item><title><![CDATA[Cpp-Socket网络编程（五）网络报文的数据格式定义及使用]]></title><link>https://blog.youkuaiyun.com/ljytower/article/details/96904499</link><guid>https://blog.youkuaiyun.com/ljytower/article/details/96904499</guid><author>ljytower</author><pubDate>Mon, 22 Jul 2019 22:53:10 +0800</pubDate><description><![CDATA[1. 网络数据报文的格式定义：

报文由包头和包体组成，其中：

- 包头：描述本次消息包的大小，描述数据的作用

- 包体：存放数据



enum CMD {
    CMD_LOGIN,
    CMD_LOGINOUT
};

//包头
struct DataHeader {
    short dataLength; //数据长度
    short cmd; //命令
};

//包体...]]></description><category></category></item><item><title><![CDATA[Cpp-Socket网络编程（四）发送结构化的网络消息数据(Mac OS环境)]]></title><link>https://blog.youkuaiyun.com/ljytower/article/details/96900161</link><guid>https://blog.youkuaiyun.com/ljytower/article/details/96900161</guid><author>ljytower</author><pubDate>Mon, 22 Jul 2019 21:31:11 +0800</pubDate><description><![CDATA[本篇内容相比于（三）服务器端和客户端业务逻辑上没有变化，只是消息组织形式发生改变。之前消息采用纯字符串形式，纯字符串的消息优点是处理简易命令方便快捷，缺点是传递大量数据时字符串解析消耗大。

本篇采用结构化的二进制数据流传输网络消息，需要严格的网络字节序一致，但是方便、消耗小、解析快。

定义结构化数据（采用结构体）：


struct DataPackage { //字节序顺序和对齐要保持一致
...]]></description><category></category></item><item><title><![CDATA[数据库隔离级别分析]]></title><link>https://blog.youkuaiyun.com/ljytower/article/details/96740989</link><guid>https://blog.youkuaiyun.com/ljytower/article/details/96740989</guid><author>ljytower</author><pubDate>Sun, 21 Jul 2019 18:03:10 +0800</pubDate><description><![CDATA[数据库隔离级别（MySQL默认隔离级别是可重复读）：

1. read uncommitted 读取未提交数据：如果用户A正读取表t1，用户B对表t1作出修改但未提交，当用户A再次读取t1时，可以读到修改的数据。是隔离级别最低的情况，读取到未提交的数据，会造成脏读问题。

2. read committed 读取已提交数据：如果用户A正读取表t1，并对t1作出修改，然后用户B再读取表t1，读取的数...]]></description><category></category></item><item><title><![CDATA[Cpp-Socket网络编程（三）建立能持续处理请求的C/S网络程序(Mac OS环境)]]></title><link>https://blog.youkuaiyun.com/ljytower/article/details/96726939</link><guid>https://blog.youkuaiyun.com/ljytower/article/details/96726939</guid><author>ljytower</author><pubDate>Sun, 21 Jul 2019 16:17:05 +0800</pubDate><description><![CDATA[经过了网络编程（一）（二）的学习，完成了搭建简单的模型，但是：

服务器端只能等待客户端的连接，向客户端发送一条数据，然后持续该循环；
客户端只能在连接服务器之后接收服务器的数据，然后打印再退出。

总结：这样的简单模型能够不停地处理客户端连接，但是不能处理复杂的业务，因此本篇对该简单模型进行改造，建立能持续处理请求的C/S网络程序。
正式改造步骤：
一、服务器端的改造
拓展为八个步骤：

建立一...]]></description><category></category></item><item><title><![CDATA[Cpp-Socket网络编程（二）简易客户端搭建(Mac OS环境)]]></title><link>https://blog.youkuaiyun.com/ljytower/article/details/96641169</link><guid>https://blog.youkuaiyun.com/ljytower/article/details/96641169</guid><author>ljytower</author><pubDate>Sat, 20 Jul 2019 23:44:06 +0800</pubDate><description><![CDATA[0719：用socket API 四步建立客户端

1. 建立一个socket

2. 连接服务器

3. 接受服务器信息recv

4. 关闭套接字close socket


//
//  client.cpp
//  SocketStepByStep
//
//  Created by tower on 2019/7/19.
//  Copyright © 2019 tower. All r...]]></description><category></category></item><item><title><![CDATA[关于TCP三次握手的进一步分析]]></title><link>https://blog.youkuaiyun.com/ljytower/article/details/96511833</link><guid>https://blog.youkuaiyun.com/ljytower/article/details/96511833</guid><author>ljytower</author><pubDate>Fri, 19 Jul 2019 23:38:16 +0800</pubDate><description><![CDATA[今天和小伙伴探讨了关于TCP的三次握手的特殊情况：
TCP三次握手的第三个ACK丢了怎么办？
（参考作者@john-zeng）

正常情况：当客户端收到服务器端的SYN+ACK确认报文后，其状态变为ESTABLISHED，并发送ACK确认给服务器端。
特殊情况：如果此时ACK丢失了，那么服务器端的状态变为SYN_RECV，并且等待3秒、6秒、12秒后重新发送SYN+ACK包给客户端（服务器端重发S...]]></description><category></category></item><item><title><![CDATA[实习记录——GDB调试]]></title><link>https://blog.youkuaiyun.com/ljytower/article/details/96509897</link><guid>https://blog.youkuaiyun.com/ljytower/article/details/96509897</guid><author>ljytower</author><pubDate>Fri, 19 Jul 2019 23:20:58 +0800</pubDate><description><![CDATA[七月份开始的两周一直在做UT用例恢复，所谓UT用例恢复是指：
针对版本A的代码编写了一套UT用例用于测试，后期版本更新，对于版本B的代码保留了大部分版本A的内容，但是也在此基础上做出了一些改进，为了使版本A的UT用例能够用于版本B，需要修改原有用例。
由于UT的编译是在Linux环境下进行的，没有可视化的调试工具，因此当某处报错需要采用单步调试确定问题所在，这里的单步调试就是利用GDB实现的。

...]]></description><category></category></item><item><title><![CDATA[Cpp-Socket网络编程（一）简易服务器端搭建(Mac OS环境)]]></title><link>https://blog.youkuaiyun.com/ljytower/article/details/95936775</link><guid>https://blog.youkuaiyun.com/ljytower/article/details/95936775</guid><author>ljytower</author><pubDate>Tue, 16 Jul 2019 07:36:09 +0800</pubDate><description><![CDATA[写在前面：

从今天正式开启学习网络编程，感谢@Evillla的推荐和安利，希望自己利用暑假的时间好好学习和消化网络编程相关知识，能在秋招中发挥到作用，收获心仪的offer！


20190714：

第一节 Socket基础API



首先一幅图介绍Socket的基础API，可以理解为一个文件读写的过程：

在客户端（前端）中，首先建立一个socket，类似于创建一个File*指针；连接服务...]]></description><category></category></item><item><title><![CDATA[关于TCP四次挥手]]></title><link>https://blog.youkuaiyun.com/ljytower/article/details/96017373</link><guid>https://blog.youkuaiyun.com/ljytower/article/details/96017373</guid><author>ljytower</author><pubDate>Mon, 15 Jul 2019 20:56:02 +0800</pubDate><description><![CDATA[今天看公众号编程珠玑推了TCP四次挥手的相关内容，想着打开复习一遍，在复习的过程中发现了一些新的问题，在此记录。
首先回顾TCP四次挥手的几个步骤：

客户端向服务器端发送释放报文FIN = 1，处于FIN_WAIT1状态；
服务器端收到后发出确认，向客户端发送ACK = X + 1，处于CLOSED_WAIT状态。（此时TCP处于半关闭状态，服务器端可以向客户端发送数据，客户端不可以向服务器端发...]]></description><category></category></item><item><title><![CDATA[实习记录——git基本操作]]></title><link>https://blog.youkuaiyun.com/ljytower/article/details/93535143</link><guid>https://blog.youkuaiyun.com/ljytower/article/details/93535143</guid><author>ljytower</author><pubDate>Mon, 24 Jun 2019 22:52:45 +0800</pubDate><description><![CDATA[前段时间做的代码整改完成了需要上库，今天借着上库的机会学了git的基本操作，首先介绍几个概念：

gerrit：是一个可以进行代码review的网站，用于在代码入库之前对代码进行审阅。这在多成员团队合作的项目中是非常有效的，能够较好地控制代码的质量。
git：是一种分布式的版本控制工具。
repo：是git上开发的版本库管理工具，repo集中维护所有git库的清单，repo可以方便的从清单中获取g...]]></description><category></category></item><item><title><![CDATA[实习记录——代码整改]]></title><link>https://blog.youkuaiyun.com/ljytower/article/details/92020354</link><guid>https://blog.youkuaiyun.com/ljytower/article/details/92020354</guid><author>ljytower</author><pubDate>Fri, 14 Jun 2019 23:36:10 +0800</pubDate><description><![CDATA[6.12正式开始实习，前两天基本都在领材料、报道、熟悉环境中度过，今天相当于正式开始步入正轨了，第一份任务是代码整改，顾名思义就是按照编程规范和代码安全规范对已写代码进行整改使其满足入库要求，初次之外，导师还通知我月底需要参加部门的考试，通过考试后才有资格将写的代码入库。这样一来，手头上的事情还是比较多的，一方面要完成被分配的任务，一方面要准备考试，另外一方面还要认真复习迎接秋招，对于这样满档的安...]]></description><category></category></item><item><title><![CDATA[C++ vector存放结构体类型的变量]]></title><link>https://blog.youkuaiyun.com/ljytower/article/details/90245259</link><guid>https://blog.youkuaiyun.com/ljytower/article/details/90245259</guid><author>ljytower</author><pubDate>Wed, 15 May 2019 21:17:23 +0800</pubDate><description><![CDATA[今天做题的时候遇到一个问题，自定义point类型的结构体作为vector的类型，并按x的大小进行排序。


#include &lt;iostream&gt;
#include &lt;vector&gt;

typedef struct Point{
    int x;
    int y;
}point;

bool cmp(point p1, point p2){
    return p...]]></description><category></category></item></channel></rss>