首页 > 其他分享 >brpc - Socket::Write

brpc - Socket::Write

时间:2023-05-28 20:32:33浏览次数:67  
标签:write head brpc old Socket req 写入 Write 节点

Socket::Write

image.png

构建一个WriteRequest, 然后调用StartWrite().

Socket::StartWrite

有一个 _write_head 成员, 每次写入时,会将WriteRequest 地址写入这个成员, 写入操作会返回旧的 req。 如果旧的req存在,则 req->next = old_req,当前线程直接返回。当前的req会在旧req写完之后被写入。

image.png

image.png

这里就是数据写入了。 紧接着会调用 ==IsWriteComplete== 函数,这个函数会取出在当前节点后添加进来的req列表,在后台线程中继续写入 ==KeepWrite==。 如果当前节点写完了,也没有新添加进来的req,那么就直接返回。

image.png

compare_exchange_strong

这是原子操作的一种, 函数原型为:

bool compare_exchange_strong (T& expected, T val,           
				memory_order sync = memory_order_seq_cst)

它是atomic类模板的一个成员函数。 Compares the contents of the contained value with expected:

  • if true, it replaces the contained value with val (like store).
  • if false, it replaces expected with the contained value .

Socket::IsWriteComplete

image.png

其实上面的意思是,尝试将未写完的节点设置到__write_head 上, 如果两者一致(没有被设置新的req)则设置成功, 那么此时会返回false, 后续会继续处理未写完的节点。如果没有未完成的节点,那么直接返回true了。

如果设置失败了,说明__write_head 被换成新的req了,函数的后面会将这些新的节点反转一下,挂在old_head上。

==总结,这个函数就是==,

  • 如果没有新的req, 则设置 desired 到 _write_head。
    • desired 分两种情况:
    • 1 old_head没写完 或者 old_head 不是单节点,此时都有没写完的数据在。需要返回false,desired就是 old_head, _write_head相当于没变。
    • 2 old_head 写完了, 且是单节点, 此时返回true就行了, desired是null, _write_head也被设置为null。
  • 如果有新的req,则需要取出新的req_list , 反转一下, 挂在old_head的后面。

image.png

Socket::KeepWrite

image.png

这个函数就简单很多, 批量写入, 写完的设置下状态, 然后req节点后移。

下面就是,取新的req,下层循环继续写。 image.png

标签:write,head,brpc,old,Socket,req,写入,Write,节点
From: https://blog.51cto.com/u_15370559/6366362

相关文章

  • C# Socket异步通信
    转载https://www.cnblogs.com/llllll/archive/2009/05/13/1455703.html 服务器端TCPServer 1、使用的通讯通道:socket2、用到的基本功能:Bind,Listen,BeginAcceptEndAcceptBeginReceive  EndReceive3、函数参数说明 Socket listener = new Socket(AddressFam......
  • 如何在 Go 中创建 WebSocket 应用程序
    要基于net/http库编写一个简单的WebSocket回显服务器,您需要:发起握手从客户端接收数据帧向客户端发送数据帧关闭握手首先,让我们创建一个带有WebSocket端点的HTTP处理程序://HTTPserverwithWebSocketendpointfuncServer(){http.HandleFunc("/",func......
  • [golang]gin框架接收websocket通信
    前言WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket让客户端和服务端之间的数据交换变得非常简单,且允许服务器主动向客户端推送数据,并且之后客户端和服务端所有的通信都依靠这个专用协议进行。本文使用gin框架编写服务端应用,配置路由接收websocket请求并处理。......
  • springboot整合websocket
    一、引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId&g......
  • UNIX网络编程:socket & select() 实现clients/server通信
    一、问题引入UNIX网络编程卷1:套接字联网API(第三版)第6章介绍了I/O复用可以通过select()的单进程服务器与多客户端通信。UNIX下可用的5中I/O模型:阻塞式I/O非阻塞式I/OI/O(select和poll)信号驱动式I/O(SIGIO)异步I/O(POSIX的aio_系列函数)其中前面4种可以分为同步I/O,第五种为......
  • C++ write batch files via filstream
    #include<assert.h>#include<atomic>#include<chrono>#include<fstream>#include<iomanip>#include<iostream>#include<mutex>#include<numeric>#include<thread>#include<unistd.h>#includ......
  • 使用Node搭建一个本地的WebSocket服务
    首先创建一个目录,cd到目录下,npminit-y一路回车,安装一个插件npmiwebsocket建一个server.js文件constWebSocketServer=require('websocket').serverconsthttp=require('http')constport=8000lettime=0//创建服务器constserver=http.createServe......
  • error: RPC failed; curl 55 OpenSSL SSL_write: Connection was aborted, errno 1005
    git初始化上传本地代码到远程出现异常造成的可能原因:1.网络原因2.无效的代理3.一次性推送的代码量过大 解决方法:1.网络原因可以等一段时间网络良好的情况上传2.无效代理的情况如下设置gitconfighttp.sslVerify"false"3.一次性推送代码量过大的情况如下设置,更改推......
  • 记录一下SOCKET编程
    记录一下基本的socket编程首先贴几段代码centos下的server代码#include<bits/stdc++.h>#include<unistd.h>#include<arpa/inet.h>#include<sys/socket.h>usingnamespacestd;intmain(){intserver,client;structsockaddr_inserverAddr,clientAddr......
  • HTB ACADEMY-Hacking WordPress WRITE UP
    YouhavebeencontractedtoperformanexternalpenetrationtestagainstthecompanyINLANEFREIGHTthatishostingoneoftheirmainpublic-facingwebsitesonWordPress.Enumeratethetargetthoroughlyusingtheskillslearnedinthismoduletofindavar......