高性能Linux服务器
Linux网络编程中常见的知识
顾文繁
功不捐唐终入海
展开
-
macOS中虚拟机桥接模式分配静态ip
在macos中,设置Linux虚拟机桥接模式静态ip地址原创 2023-02-09 21:13:06 · 1071 阅读 · 0 评论 -
condition_variable条件变量
有次面试,面试官问我有没有了解过条件变量(之前看的Linux高性能服务器编程书中,绝对提到了这个,都忘光了),我回答没有。。。。今天回过头来,整理一下。这里是引用Condition variableA condition variable is an object able to block the calling thread until notified to resume.It uses a unique_lock (over a mutex) to lock the thread when原创 2022-05-05 11:58:53 · 780 阅读 · 0 评论 -
C++线程池
使用libevent封装的c++内嵌线程池,在主线程负责调度,在开启的线程中负责处理接受到的任务。在主线程使用管道发送信号给开启的线程,在开启的线程中使用libevent监听主线程发送来的信号,接收成功以后,从线程中维护的任务队列取出,开始处理任务。下面是线程池的UML类图主函数://// Created by wenfan on 2021/5/4.//#include <iostream>#include <event2/event.h>#include.原创 2021-05-07 09:39:03 · 276 阅读 · 0 评论 -
select系统调用
select() examines the I/O descriptor sets whose addresses are passed in readfds, writefds, and errorfds to see if some of their descriptors are ready for reading, are ready for writing, or have an exceptional condition pending,respectively. The first nfd..原创 2021-04-12 09:21:44 · 206 阅读 · 0 评论 -
数据压缩通讯实现
在传输文件或者其他的网络数据时,I/O经常是高并发的瓶颈,如果一台服务器的带宽只有1M,那么每秒理论上的最大传输速率只有128kb/s,这将极大的限制了并发数量,此时,只能在I/O上进行压缩,将大块数据经过压缩算法转换为某种二进制,然后进行传输,再到服务端通过解压算法进行解压缩,进行业务逻辑处理。原创 2021-04-12 09:18:58 · 249 阅读 · 0 评论 -
libevent服务端客户端
libevent编写服务端的步骤生成上下文 event_base* base = event_base_new(); 绑定服务端的地址 sockaddr_in sin;memset(&sin, 0, sizeof(sin));sin.sin_family = AF_INET;sin.sin_port = htons(PORT); 使用libevent提供的监听器listener evconnlistener* ev = evconnlistener_new_bi.原创 2021-04-06 18:29:15 · 345 阅读 · 0 评论 -
最小堆定时器
基于最小堆实现的网络定时器头文件//// Created by wenfan on 2021/3/21.//#ifndef MIN_HEAP_H#define MIN_HEAP_H#include <iostream>#include <netinet/in.h>#include <ctime>using std::exception;#define BUFFER_SIZE 64class heap_timer; //前向声明原创 2021-03-23 19:53:29 · 413 阅读 · 0 评论 -
链表定时器
在服务端中,我们需要一个定时器去检测客户端的连接情况或者系统的信号。链表定时器头文件//// Created by wenfan on 3/11/21.//#ifndef TEST_CLION_UTIL_TIMER_H#define TEST_CLION_UTIL_TIMER_H#define BUFFSIZE 64#include <netinet/in.h>#include <time.h>class util_timer;struct cl.原创 2021-03-21 09:42:37 · 437 阅读 · 0 评论 -
网络程序定时器
服务器需要处理定时事件,比如定期检测一个客户连接的活动状态。服务器程序通常管理着众多的定时事件,因此有效地组织这些定时事件,使之能在预期的事件点被触发且不影响服务器的主要逻辑,对于服务器的性能有着至关重要的影响。为此,我们要将每个定时事件分别封装称为定时器,并实现某种容器类数据结构,比如链表、排序链表和时间轮,将所有的定时器串联起来,以实现对定时事件的统一管理。定时机制是定时器得以被处理的原动力。Linux提供到了三种定时方法,他们是:socket选项SO_RCVTIMEO和SO_SNDTIMEO。原创 2021-03-09 22:33:25 · 234 阅读 · 0 评论 -
p2p网络实现(C++)
p2p网络(对等网络):对等网络是一种网络结构的思想。它与目前网络中占据主导地位的客户端/服务器结构的一个本质区别是,整个网络结构中不存在中心节点。在P2P结构中,每一个节点(peer)大都同时具有信息消费者、信息提供者和信息通讯等三方面的功能。从计算模式上来说,P2P打破了传统的C/S模式,在网络中的每个节点的地位都是对等的。每个节点既充当服务器,为其他节点提供服务,同时也享用其他节点提供的服务。从技术层面讲,p2p网络中每个节点既充当服务端又充当了客户端,同时每个节点需要记录当前网络中所有的节点信息原创 2021-03-05 11:35:20 · 2528 阅读 · 1 评论 -
epoll 聊天程序
//#include <fcntl.h>#include <cerrno>#include <cstdlib>#include <sys/epoll.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdio.h>#include <cstring>#include <unistd.h>#include <..原创 2021-02-21 22:33:36 · 99 阅读 · 0 评论 -
Linux网络编程中 按位操作
写Linux程序经常会看到&和|按位操作符号,具体就是内核提供的宏之间进行按位操作。他们具体什么意思?我们在macOS中看到poll.h的事件的宏定义:#define POLLIN 0x0001 /* any readable data available */#define POLLPRI 0x0002 /* OOB/Urgent readable data */#define POLLOUT原创 2021-02-20 17:16:46 · 201 阅读 · 0 评论 -
select poll epoll 三组I/O复用函数比较
select、poll和epoll这三组I/O复用系统调用都能同时监听多个文件描述符。它们将等待由timeout参数指定的超时时间,直到一个或者多个文件描述符上有事件发生时返回,返回值是就绪的文件描述符的数量。返回0表示没有事件发生。现在我们从事件集、最大支持文件描述符、工作模式和具体实现等四个方面进一步比较他们的异同,以明确在实际应用中应该选择使用那个。这三组函数都能通过某种结构体变量来告诉内核监听哪些文件描述符上的哪些事件,并使用该结构体类型的参数来获取内核处理的结果。selectselec原创 2021-02-17 22:27:08 · 96 阅读 · 0 评论 -
EPOLLONESHOT事件
我们希望一个socket只能同时被一个线程(进程)操作。epoll的EPOLLONESHOT可以实现。对于注册了EPOLLONESHOT事件的文件描述符,操作系统最多触发其上注册的一个可读、可写或者异常事件,且只触发一次。 除非我们使用epoll_ctl函数重置该文件描述符上注册的EPOLLONESHOT事件。这样,当一个线程在处理某个socket时候,其他线程是不可能有机会操作该socket的。反过来,注册了EPOLLONESHOT事件的socket一旦被某个线程处理完毕,该线程就应该立即重置这个so原创 2021-02-17 21:16:58 · 2741 阅读 · 2 评论 -
epoll系统调用
epoll_create函数epoll是Linux特有的I/O复用函数。它在实现上与select和poll有很大差异。epoll使用一组函数来完成任务,而select使用单个函数来完成。epoll把用户关心的文件描述符上的事件放在内核里的一个事件表中,从而无须向select和poll那样每次调用都要重复传入文件描述符集或者事件集。但是eopll需要使用一个额外的文件创建描述符,来唯一标示内核中这个事件表。这个文件描述符使用如下epoll_create函数来创建:#include <sys/e原创 2021-02-16 21:59:26 · 526 阅读 · 0 评论 -
select I/O复用模型实例
基于Linux系统内核的select I/O复用cpp实现实验结果就不贴了,即多个客户端可以和服务端进行通讯。实现了IO复用。//// main.cpp// select_server//// Created by wenfan on 2021/2/15.//#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#includ原创 2021-02-15 22:47:36 · 82 阅读 · 0 评论 -
I/O复用
I/O复用使得程序能同时监听多个文件描述符,这对提高程序的性能至关重要。通常,网络程序在下列情况下需要使用I/O复用复用技术:客户端程序要同时处理多个socket 客户端程序要同时处理用户输入和网络连接。 TCP服务器要同时处理监听socket和连接socket。这是I/O复用使用最多的场景。 服务器要同时处理TCP请求和UDP请求。 服务器要同时监听多个端口,或者处理多种服务。需要指出的是,I/O复用虽然能同时监听多个文件描述符,但它本身是阻塞的。并且当多个文件描述符同时就绪时,如果不原创 2021-02-13 15:51:30 · 133 阅读 · 1 评论 -
并发模式
并发编程并发编程的目的是让程序“同时”执行多个任务。如果程序是计算密集型的,并发编程并没有优势,反而由于任务的切换是运行效率降低。但如果程序是I/O密集型的,如经常访问读写文件,访问数据库等,情况就不一样了。由于I/O操作的速度远没有CPU的计算速度快,所以让程序阻塞于I/O操作将浪费大量的CPU时间,如果程序有多个执行线程,则当前被I/O操作所阻塞的执行线程可主动放弃CPU(或有操作系统来调度),并将执行权转移到其他线程。如此,CPU就可以用来做其他的任务,而不是等待I/O操作完成,因此CPU的利.原创 2021-02-12 21:07:29 · 660 阅读 · 0 评论 -
Reactor网络设计模式
Reactor模式简单通信模型缺点在于内核函数会阻塞,CPU利用率低。Reactor事件处理模式应运而生。同步I/O模型通常用于实现Reactor模式。Reactor模式要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将该事件通知工作单元(逻辑单元)。除此之外,主线程不做任何其他实质性的工作。读写数据,接受新的连接,以及处理客户请求均在工作线程中完成。使用同步I/O模型(以epoll_wait为例)实现的Reactor模式的工作流程1、主线程往epol..原创 2021-02-09 22:16:20 · 147 阅读 · 0 评论 -
I/O模型初识
sock在创建的时候默认是阻塞的。我们可以使用socket系统调用的第二个参数传递SOCK_NONBLOCK标志,或者通过fcntl系统调用的F_SETFL命令,将socket设置为非阻塞的。阻塞和非阻塞的概念能应用与所有的文件描述符,而不仅仅是socket。针对阻塞I/O执行的系统调用可能因为无法立即完成而被操作系统挂起,直到等待的事件完成。在socket的基础API中,可能被阻塞的系统调用包括accpet、send、recv 和 connectI/O复用I/O复用是最常见的使用I/O通知机.原创 2021-02-09 20:57:13 · 68 阅读 · 0 评论 -
Linux 高级I/O函数-sendfile
sendfile函数在两个文件描述符之间直接传递数据(完全在内核中传递),从而避免了内核缓冲区和用户缓冲区之间的数据拷贝,效率很高,又称为zero-copy。函数原型:#include<sys/sendfile.h>ssize_t sendfile(int out_fd, int in_fd, off_t* offset, size_t count);其中in_fd就可以认为是读入的文件操作符,out_fd是连接sock_fd,offset为偏移量,为空则从默认的其实位..原创 2021-02-06 23:19:55 · 277 阅读 · 0 评论 -
Linux 高级I/O函数-dup函数
dup函数有时候我们希望把标准输入重定向到一个文件,或者把标准输出重定向到一个网络连接,可以通过用于复制文件描述符的dup或者dup2函数实现。利用dup函数实现一个基本的CGI服务器//// Created by wenfan on 2021/2/6.//#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <cassert>#i原创 2021-02-06 20:45:37 · 157 阅读 · 0 评论 -
Xcode 使用hiredis连接redis
Xcode 使用hiredis连接redis1. 去https://github.com/redis/redis下载redis源码cd hiredismakemake install2. 打开xcode 创建一个xcode command line 工程连接代码如下#include <stdio.h>#include <hiredis/hiredis.h> int main(){ redisContext* conn = re..原创 2020-12-21 15:29:21 · 242 阅读 · 0 评论 -
Linux/macOS 服务端/客户端简单通信
嗯......,感觉还是CSDN界面友好点,博客园一股Windows风。好久之前总结的简单Linux 服务器和客户端的通信代码现在搬过来。client.cpp#include <iostream>#include <sys/types.h>#include <sys/socket.h>#include <string>#include <stdio.h>#include <unistd.h>#include &原创 2020-11-25 22:35:18 · 212 阅读 · 0 评论