自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

站在树顶端设计的男人

后端服务器/DeepLearning

  • 博客(12)
  • 资源 (1)
  • 问答 (3)
  • 收藏
  • 关注

原创 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 &lt..

2021-02-21 22:33:36 104

原创 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 203

原创 select poll epoll 三组I/O复用函数比较

select、poll和epoll这三组I/O复用系统调用都能同时监听多个文件描述符。它们将等待由timeout参数指定的超时时间,直到一个或者多个文件描述符上有事件发生时返回,返回值是就绪的文件描述符的数量。返回0表示没有事件发生。现在我们从事件集、最大支持文件描述符、工作模式和具体实现等四个方面进一步比较他们的异同,以明确在实际应用中应该选择使用那个。这三组函数都能通过某种结构体变量来告诉内核监听哪些文件描述符上的哪些事件,并使用该结构体类型的参数来获取内核处理的结果。selectselec

2021-02-17 22:27:08 97

原创 EPOLLONESHOT事件

我们希望一个socket只能同时被一个线程(进程)操作。epoll的EPOLLONESHOT可以实现。对于注册了EPOLLONESHOT事件的文件描述符,操作系统最多触发其上注册的一个可读、可写或者异常事件,且只触发一次。 除非我们使用epoll_ctl函数重置该文件描述符上注册的EPOLLONESHOT事件。这样,当一个线程在处理某个socket时候,其他线程是不可能有机会操作该socket的。反过来,注册了EPOLLONESHOT事件的socket一旦被某个线程处理完毕,该线程就应该立即重置这个so

2021-02-17 21:16:58 2768 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 531

原创 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 83

原创 I/O复用

I/O复用使得程序能同时监听多个文件描述符,这对提高程序的性能至关重要。通常,网络程序在下列情况下需要使用I/O复用复用技术:客户端程序要同时处理多个socket 客户端程序要同时处理用户输入和网络连接。 TCP服务器要同时处理监听socket和连接socket。这是I/O复用使用最多的场景。 服务器要同时处理TCP请求和UDP请求。 服务器要同时监听多个端口,或者处理多种服务。需要指出的是,I/O复用虽然能同时监听多个文件描述符,但它本身是阻塞的。并且当多个文件描述符同时就绪时,如果不

2021-02-13 15:51:30 135 1

原创 并发模式

并发编程并发编程的目的是让程序“同时”执行多个任务。如果程序是计算密集型的,并发编程并没有优势,反而由于任务的切换是运行效率降低。但如果程序是I/O密集型的,如经常访问读写文件,访问数据库等,情况就不一样了。由于I/O操作的速度远没有CPU的计算速度快,所以让程序阻塞于I/O操作将浪费大量的CPU时间,如果程序有多个执行线程,则当前被I/O操作所阻塞的执行线程可主动放弃CPU(或有操作系统来调度),并将执行权转移到其他线程。如此,CPU就可以用来做其他的任务,而不是等待I/O操作完成,因此CPU的利.

2021-02-12 21:07:29 666

原创 Reactor网络设计模式

Reactor模式简单通信模型缺点在于内核函数会阻塞,CPU利用率低。Reactor事件处理模式应运而生。同步I/O模型通常用于实现Reactor模式。Reactor模式要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将该事件通知工作单元(逻辑单元)。除此之外,主线程不做任何其他实质性的工作。读写数据,接受新的连接,以及处理客户请求均在工作线程中完成。使用同步I/O模型(以epoll_wait为例)实现的Reactor模式的工作流程1、主线程往epol..

2021-02-09 22:16:20 153

原创 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 70

原创 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 283

原创 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 161

p2p网络实现(C++)

C/C++实现一个p2p网络集群,并通信

2021-03-05

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除