![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
基础
文章平均质量分 55
liuyuan185442111
主要为了增强记忆和方便查询,评论如果没有及时回复,还请见谅
展开
-
一个出现异常CLOSE_WAIT连接的问题
listen的端口触发读事件,epoll_wait返回后,accept返回失败,连接已经建立,但没与文件描述符关联。正常情况对端主动关闭的话,我方进入CLOSE_WAIT状态。原创 2023-12-03 11:13:59 · 183 阅读 · 0 评论 -
一个没正常处理tcp对端关闭的bug
以及其他搜索结果,如果没通过SO_LINGER选项改变close的默认行为,调用close关闭socket时,会关闭两个方向的数据流。写方向上,内核会尝试将发送缓冲区的数据发送,之后发送FIN包结束连接,这个过程中,往套接字写入数据都会返回异常;最近使用自研的http client时发现一个问题,对端在发送响应数据之后立即调用close关闭了连接,我这没有调用到响应的回调,而是调用到了连接关闭的回调。有问题的接收代码如下,问题在于recv返回0时,没有处理已经收到的数据就直接关闭socket。原创 2023-11-25 11:31:41 · 560 阅读 · 0 评论 -
关于tcp发送成功但对端无法接收情况的思考
客户端在调用send函数或其他函数发送数据时,只是把数据拷贝到socket缓冲区,即可返回成功,但在系统把缓冲区数据经过协议栈、网卡发送到网络上时,服务器正好关闭了连接,就会出现客户端以为发送成功了,但服务器并没有接收到,有些请求就丢失了。所以尝试复用http连接,请求的时候在头部添加Connection:Keep-alive,对端支持,但会在一定时常或一定请求次数后关闭该连接。为什么有些即时聊天软件用udp,是不是也有一点这种考虑,反正即使用tcp,应用层也要做消息确认和超时重传,直接用udp得了。原创 2023-11-11 11:24:32 · 1691 阅读 · 0 评论 -
页表和cache
当我们访问0x40地址时,依然索引到cache中第0行cache line,由于此时cache line中存储的是地址0x00地址对应的数据,所以此时依然会cache缺失。1个tag对应1个cache line,所以offset位不需要考虑,对比tag的时候已经定位到具体的行了,index位也是固定的了,所以tag只需要记录除offset和index外的位,该例中是32-3-3=26位。别名问题是因为虚拟地址和物理地址多对一导致的,只要物理地址相同的虚拟地址,也在相同的cache地址中就不会有问题。原创 2023-11-10 23:03:53 · 1221 阅读 · 0 评论 -
理解无栈协程
c++20加入了协程,为了性能实现的是无栈协程。有栈协程与无栈协程和有栈协程与无栈协程对协程的两种实现做了介绍,简单来说有栈协程是可以中断并恢复执行的subroutine,无栈协程是状态机。使用 C 语言实现协程中介绍的这个无栈协程实现可以帮助更好的理解为什么说无栈协程是状态机。coroutine.h只用三个宏(这里有简化)就实现了一个不可重入的无栈协程:#define scrBegin static int scrLine=0; switch(scrLine) { case 0:#defi原创 2022-02-26 19:20:58 · 2405 阅读 · 0 评论 -
造https client轮子的记录
最近我们的服务器需要嵌入HTTP服务,需要支持httpclient和httpserver,httpclient要同时支持https。我们现在服务器进程之间的网络通信使用的是自有实现,它使用io多路复用技术。因为http只是在tcp之上进行明文传输而已,所以实现也包括了一个简陋的httpclient和httpserver,还基于openssl实现玩具版的https,但基本是不能在生产中使用的。本来我想着用开源库,但看了下好像与epoll结合也挺麻烦,就先自己手撸轮子试试。虽然过程痛苦,但加深了对相关知识的原创 2022-01-24 20:49:00 · 1547 阅读 · 0 评论 -
理解https的验证过程
我们知道http是明文传输的,所以:1数据可能被窃听和篡改 2察觉不到客户端和服务器之间是否有中间人。为了防止1,可以对数据进行加密:(可以看到https在内容传输的加密上使用的是对称加密)为了防止2,要保证服务器的公钥确实是它的,可以请权威机构对公钥进行数字签名。具体一点就是,签名方有一对密钥,暂称为CA公钥、CA密钥,先计算『服务器公钥和一些比如域名之类的其他信息』的摘要,然后用CA密钥对摘要进行加密,这些信息和加密后的摘要组成数字证书,然后颁发给服务器。当然证书还包括过期时间,颁发机构的指纹原创 2022-01-01 16:27:02 · 360 阅读 · 0 评论 -
不要使用TCP的KeepAlive功能
TCP的KeepAlive机制用来检测连接是否存活,它并不是TCP协议规范的一部分,但在几乎所有的TCP/IP协议栈中,都实现了KeepAlive功能。KeepAlive有三个参数:keepalive_time:探测的超时keepalive_probes:探测次数keepalive_intvl:探测间隔对一个已经建立的tcp连接,如果在keepalive_time时间内双方没有任何的数据包传输,则开启keepalive功能的一端将发送 keepalive数据包,若没有收到应答,则每隔keepal原创 2021-06-03 11:55:01 · 1047 阅读 · 0 评论 -
关于尾调用消除
看《Lua程序设计》中关于尾调用的章节,Lua是支持尾调用消除的,但需要明确的return func(args)形式的调用,例如:local s=0--不是尾调用function add(n) s = s + n if n>0 then add(n-1) endend--是尾调用function add2(n) s = s + n if n>0 then ...原创 2020-01-03 17:52:48 · 310 阅读 · 1 评论 -
设计模式简单记录
单例模式工厂模式建造者模式 将一个复杂对象的构建分成几部分,比如汽车零件的分别建造原型模式 用原型实例制定创建对象的种类,并通过拷贝这些原型的创建新的对象。为每个类先创建一个对象,以后需要某种对象的时候,通过clone创建,比如我们项目里通过协议id创建具体协议对象迭代器模式命令模式 根据调用者的命令去做事情解释器模式责任链模式 多个handler链成一个链,比如jsp里的filte...原创 2019-12-21 11:47:46 · 104 阅读 · 0 评论 -
三个多线程同步问题及其实现
.原创 2015-11-22 22:51:10 · 1896 阅读 · 0 评论 -
网络与并发
.原创 2015-10-04 13:44:27 · 825 阅读 · 0 评论 -
BSS段、数据段、代码段、堆、栈
.原创 2015-09-23 14:32:44 · 2374 阅读 · 1 评论 -
一些树的知识
.原创 2015-06-04 19:53:58 · 583 阅读 · 0 评论 -
hash 哈希表
.原创 2015-05-11 18:33:12 · 617 阅读 · 0 评论 -
正则表达式
.原创 2015-05-03 23:11:45 · 568 阅读 · 0 评论 -
字符编码问题
.原创 2017-07-05 14:38:13 · 536 阅读 · 0 评论 -
补码
.原创 2017-07-04 16:48:14 · 699 阅读 · 0 评论