首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

co-uring-http: 基于 C++ 无栈协程与 io_uring 的高性能 HTTP 服务器

Linux 通过隔离内核页表来应对 Meltdown 攻击后, 系统调用的开销是不可忽略的, 而 io_uring 通过映射一段在用户态与内核态共享的内存区域, 显著减少系统调用的次数, 缓解了刷新缓存开销...C++ 20 引入的无栈协程让编写异步程序容易了不少, 之前通过回调函数实现的功能可以全部通过类似同步代码的写法来实现....为了体验这些特性, 我用 C++ 20 协程与 io_uring 重新实现了一个烂大街项目: HTTP 服务器....鉴于以前没用过 C++ 写项目, 再加上 GitHub 常见的 HTTP 服务器项目是基于 Reactor 模式与 epoll 实现的, 以至于我开发的过程中能借鉴 (指复制) 的机会并不多, 希望各位包容一下我的逆天代码...thread_worker::accept_client() 协程一个循环通过调用 server_socket::accept() 来提交一个 multishot accept 请求到 io_uring

38010

SIGPIPE

我写了一个服务器程序,Linux下测试,然后用C++写了客户端用千万级别数量的短链接进行压力测试. 但是服务器总是莫名退出,没有core文件....最后问题确定为, 对一个对端已经关闭的socket调用两次write, 第二次将会生成SIGPIPE信号, 该信号默认结束进程. 具体的分析可以结合TCP的”四次握手”关闭....所以, 第二次调用write方法(假设在收到RST之后), 会生成SIGPIPE信号, 导致进程退出....linux下写socket的程序的时候,如果尝试send到一个disconnected socket上,就会让底层抛出一个SIGPIPE信号。...调用以下代码,即可安全的屏蔽SIGPIPE: signal (SIGPIPE, SIG_IGN); 我的程序产生这个信号的原因是: client端通过 pipe 发送信息到server端后,就关闭

46220
您找到你想要的搜索结果了吗?
是的
没有找到

Nodejs cluster模块深入探究

延伸下,在学习linux下的socket编程时,服务端的逻辑依次是执行socket(),bind(),listen()和accept(),接收到客户端连接时执行read(),write()调用完成TCP...backlog是已连接但未进行accept处理的socket队列大小。linux 2.2以前,backlog大小包括了半连接状态和全连接状态两种队列大小。...code1中,主进程与所有子进程通过消息构建出侦听8000端口的TCP服务器,那么子进程中有没有也创建一个服务器,同时侦听8000端口呢?其实,子进程中压根就没有这回事,如何理解呢?...可是内核调度往往出现意想不到的效果,linux下导致请求往往集中某几个子进程中处理。...尝试几天仔细研读node cluster相关模块后有感于其良好的封装性,故产生将其内部实现原理和技巧向日常开发者所展示的想法,最后有了这篇文章。

1.8K100

Nodejs+socket.io搭建WebRTC信令服务器

通过该引擎,可以让 js 调用 C/C++方法 或 对象。相反,通过它也可能让 C/C++ 访问 javascript 方法和变量。...所以 Nodejs 的强大就在于 js 可以直接调用 C/C++ 的方法,使其能力可以无限扩展。...大家可以看到,以前Linux下安装个程序或工具是多么的麻烦。 Linux 有了apt 之后,一切都变得简单了。...搭建信令服务器 接下来我们来看一下,如何通过 Nodejs下的 socket.io 来构建的一个服务器: 这是客户端代码,也就是浏览器里执行的代码。index.html: <!...通过上面的步骤我们就使用 socket.io 构建好一个服务器,现在可以通过下面的命令将服务启动起来了: node server.js 如果你是本机上搭建的服务,则可以浏览器中输入 localhost

8.2K20

PHP并发IO编程之路

多进程/线程模型的流程是: 创建一个 socket,绑定服务器端口(bind),监听端口(listen),PHP中用stream_socket_server一个函数就能完成上面3个步骤,当然也可以使用...accept函数返回客户端连接的socket 主进程多进程模型下通过fork(php: pcntl_fork)创建子进程,多线程模型下使用pthread_create(php: new Thread)...IO复用/事件循环/异步非阻塞 其实IO复用的历史和多进程一样长,Linux很早就提供了select系统调用,可以一个进程内维持1024个连接。...这样问题就来了,如果服务器有100万个连接,某一时间只有一个连接向服务器发送了数据,select/poll需要做循环100万次,其中只有1次是命中的,剩下的99万9999次都是无效的,白白浪费了CPU...直到Linux2.6内核提供了新的epoll系统调用,可以维持无限数量的连接,而且无需轮询,这才真正解决了C10K问题。

1.9K70

校招找C++后台开发该准备什么样的项目比较好呢?

这篇文章是回答一位小方说服务器开发知识星球的球友的问题,他的问题是: 秋招找C++后台开发该准备什么样的项目比较好呢? 目前有两个想法: 1. 做一个小型的Web服务器;2....该同学的描述是主线程开启监听 socket 之后,进入无限循环调用 accept 处理客户端连接,accept 返回新的客户端 socket 后封装成任务交给线程池处理,线程池的线程共用一个队列,当有任务产生时...支持 Windows 和 Linux 多平台。...作者的本意是,由于 socket 是非阻塞的,所以一个死循环(注意上述代码中 for 循环没有退出条件)中收取数据,一直收到 \n 结束(http 的头每一行都以 \r\n 结束),所以收到一个 \n...+服务器开发精髓》 张远龙 著 从操作系统原理角度讲解C++服务器开发技术栈 内容详尽细致、版本新 重磅级C++服务器开发红宝书 本书详细讲解如何掌握C++服务器开发技术,以及如何成为合格的C++开发者

87841

PHP并发IO编程之路

多进程/多线程同步阻塞 最早的服务器端程序都是通过多进程、多线程来解决并发IO的问题。进程模型出现的最早,从Unix系统诞生就开始有了进程的概念。...accept函数返回客户端连接的socket 主进程多进程模型下通过fork(php: pcntl_fork)创建子进程,多线程模型下使用pthread_create(php: new Thread)...IO复用/事件循环/异步非阻塞 其实IO复用的历史和多进程一样长,Linux很早就提供了select系统调用,可以一个进程内维持1024个连接。...这样问题就来了,如果服务器有100万个连接,某一时间只有一个连接向服务器发送了数据,select/poll需要做循环100万次,其中只有1次是命中的,剩下的99万9999次都是无效的,白白浪费了CPU...直到Linux 2.6内核提供了新的epoll系统调用,可以维持无限数量的连接,而且无需轮询,这才真正解决了C10K问题。

1.3K10

Android Socket通信实现简单聊天室

第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包...服务端 客户端跟服务端通信之前,服务端必须先开启。首先来看一下服务端Socket的编写吧。...接收客户端请求,通过一个while循环不断轮询来自服务端的连接请求,while循环里面调用了serverSocket.accept();是线程进入阻塞状态,也就是说没有接收到客户端的请求时,程序将一直停留在这里...while进行无限循环进行读取socket的输入流,如果内容不为空就调用sendmsg对每一个客户端进行信息发送,有个小小的处理就是如果发送过来的信息是bye的时候就断开对应socket的链接,退出聊天室...while无限循环读取来自服务端的信息,一旦读取到信息之后就通过handler从子线程发送消息到主线程,主线程进行数据的更新,其实就是向显示聊天室内容的textview追加聊天内容并且setText上去

1.6K10

PHP并发IO编程之路

多进程/多线程同步阻塞 最早的服务器端程序都是通过多进程、多线程来解决并发IO的问题。进程模型出现的最早,从Unix系统诞生就开始有了进程的概念。...accept函数返回客户端连接的socket 主进程多进程模型下通过fork(php: pcntl_fork)创建子进程,多线程模型下使用pthread_create(php: new Thread)...IO复用/事件循环/异步非阻塞 其实IO复用的历史和多进程一样长,Linux很早就提供了select系统调用,可以一个进程内维持1024个连接。...这样问题就来了,如果服务器有100万个连接,某一时间只有一个连接向服务器发送了数据,select/poll需要做循环100万次,其中只有1次是命中的,剩下的99万9999次都是无效的,白白浪费了CPU...直到Linux 2.6内核提供了新的epoll系统调用,可以维持无限数量的连接,而且无需轮询,这才真正解决了C10K问题。

1.8K40

PHP SOCKET编程

php4.x 以后有这么一个模块extension=php_sockets.dll,Linux上是一个extension=php_sockets.so。...1) 多进程/多线程同步阻塞 最早的服务器端程序都是通过多进程、多线程来解决并发IO的问题。...IO复用/事件循环/异步非阻塞 其实IO复用的历史和多进程一样长,Linux很早就提供了select系统调用,可以一个进程内维持1024个连接。...这样问题就来了,如果服务器有100万个连接,某一时间只有一个连接向服务器发送了数据,select/poll需要做循环100万次,其中只有1次是命中的,剩下的99万9999次都是无效的,白白浪费了CPU...直到Linux 2.6内核提供了新的epoll系统调用,可以维持无限数量的连接,而且无需轮询,这才真正解决了C10K问题。

1K20

C++ Socket套接字概述

通过互联网进行通信,至少需要一对套接字,其中一个运行于客户端,我们称之为Client Socket,另一个运行于服务器端,我们称之为Server Socket 1. socket套接字 socket...的三次握手: 第一次握手:客户端需要发送一个syn j 包,试着去链接服务器端,于是客户端我们需要提供一个链接函数 第二次握手:服务器端需要接收客户端发送过来的syn J+1 包,然后发送ack包,所以我们需要有服务器端接受处理函数...(阻塞等待,使用循环) recv():从socket中读取字符(接收socket客户端的消息,可使用子线程控制多个连接) close():关闭socket client客户端: socket():创建socket...网络字节顺序与本地字节顺序之间的转换函数 参考:htons(), ntohl(), ntohs(),htons()这4个函数 C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题。...退出 UNIX网络编程(基本TCP套接字编程78页)给出了一个解释说的是:当我们关闭客户端后,客户端会发送一个数据(EOF,也就是0) 然后服务端通过read()函数收到这个数据,,知道了客户端已经退出

1.1K30

基于TCP的套接字

tcp服务端 1 ss = socket() #创建服务器套接字 2 ss.bind() #把地址绑定到套接字 3 ss.listen() #监听链接 4 inf_loop:...#服务器无限循环 5 cs = ss.accept() #接受客户端链接 6 comm_loop: #通讯循环 7 cs.recv()/cs.send()...# 创建客户套接字 2 cs.connect() # 尝试连接服务器 3 comm_loop: # 通讯循环 4 cs.send()/cs.recv() # 对话(发送...这个是由于你的服务端仍然存在四次挥手的time_wait状态占用地址(如果不懂,请深入研究1.tcp三次握手,四次挥手 2.syn洪水攻击 3.服务器高并发情况下会有大量的time_wait状态的优化方法...#就是它,bind前加 phone.bind(('127.0.0.1',8080)) 发现系统存在大量TIME_WAIT状态的连接,通过调整linux内核参数解决, vi /etc/sysctl.conf

73410

(三)服务器端的程序架构介绍1

各个服务程序的作用描述如下: LoginServer (C++): 负载均衡服务器,分配一个负载小的MsgServer给客户端使用 MsgServer (C++): 消息服务器,提供客户端大部分信令处理功能...,包括私人聊天、群组聊天等 RouteServer (C++): 路由服务器,为登录在不同MsgServer的用户提供消息转发功能 FileServer (C++): 文件服务器,提供客户端之间得文件传输服务...,支持在线以及离线文件传输 MsfsServer (C++): 图片存储服务器,提供头像,图片传输中的图片存储服务 DBProxy (C++): 数据库代理服务器,提供mysql以及redis的访问服务...该网络框架是一个循环里面不断地检测IO事件,然后对检测到的事件进行处理。流程如下: 1. 使用IO复用技术(linux和windows平台用select、mac平台用kevent)分离网络IO。...TeamTalk源码中每一个socket连接被封装成一个CBaseSocket对象,该对象是一个使用引用计数的类的子类,通过这种方法来实现生存期自动管理。

1.1K70

笔试面试的小结 反

,考了C++, STL,数据结构,概率,计算机网络,操作系统,linux比较广,感觉C++考高级机制比较多,什么bss,全局变量,局部变量,静态全局变量,静态变量的内存位置,stl中的list的迭代器...IDG企业 这是一个集体校招的企业,宣讲会的时候有6个公司的负责人到上面讲了,感觉完全是宣传他们的公司,之后进行了现场的笔试,笔试题,不难,C++ 基础知识,一道去重复的算法(leetcode里面的题目...http请求过程,一道算法设计题(基本上比较常见),最后一道是数据库设计,虽然我报的服务器研发工程师,这个题目基本是笔试通过不了的,后面也没收到面试通知,当然感觉他们的业务也不太时候我。...linux内存管理,swap,如何查看内存,如何参看CPU利用率,如何参看磁盘,GDB ,core文件 计算机网络 TCP三次握手和四次分手中的各种状态和原理,TCP 和UDP 的区别,socket...接下来的复习: (1)最好做一个linux相关的项目(apue,实现线程池)或做一个简单的ftp服务器(unp, 网络编程) (2)算法: , 100题(大神博客),数组,字符串

80341

又被百度捞起来了,能赢吗?

之前有同学反馈说,有没有 C++ 服务器开发的面试呀? 还真有,最近有 C++ 同学被百度从简历池捞起来面试了,目前经历了一二面,我把比较通用的面试问题抽离出来跟大家分享一波。...,监听到连接请求后,调用connect函数,先将socket放到半连接队列,然后再通过三次握手到全连接队列,最后返回一个新的socket进行通信。...早期 Linux 内核 backlog 是 SYN 队列大小,也就是未完成的队列大小。...答: 默认创建的 socket 都是阻塞模式的, Linux 平台上,我们可以使用 fcntl() 函数或 ioctl() 函数给创建的 socket 增加 O_NONBLOCK 标志来将 socket...当然,Linux 下的 socket() 创建函数也可以直接在创建时将 socket 设置为非阻塞模式,socket() 函数的签名如下: int socket(int domain, int type

8210

Linux下几种并发服务器的实现模式(详解)

2>循环服务器和并发服务器 1.循环服务器:一个server只能一次只能接收一个client,当当前client结束访问之后才能进行下一个client的连接。...,由于多进程服务器创建进程时要消耗较大的系统资源,所以用线程来取代进程,这样服务处理程序可以较快的创建。...是指TCP连接后,每一个客户机的请求并不由服务器直接处理,而是由服务器创 3.多路复用I/O I/O是为了解决线程/进程阻塞在那个I/O调用中,常用select或者pool 4>epoll linux2.6...2.边缘触发方式: 如果文件描述符自上次状态改变后有新的IO活动到来,此时会触发通知。...以上这篇Linux下几种并发服务器的实现模式(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考。

89821

socket方式传输文件

socket通信实现文件的传输,TCP传输方式,python版与C/C++版。...break # 关闭套接字【close】 tcp_client_socket.close() 上述程序修改搬运自:Python3使用TCP编写一个简易的文件下载器--Linux公社 ,服务器端添加了一段打印本机...程序Windows和Linux系统上均可运行,测试时需要在服务器程序所在路径新建一个data文件夹并放入用于测试的文件,如图片、视频文件等。...另外,实测win10的服务器端程序与Ubuntu10的客户端通信这种情况,win10的服务器端必须在IDLE环境中运行,cmd命令行中运行无法连接,原因未知。...服务器端 server.cpp // 客户端发送字符串,服务器接收字符串,以相同内容返回 (循环服务) #include #include #include <

3K10
领券