![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux网络编程
文章平均质量分 59
Mango酱
这个作者很懒,什么都没留下…
展开
-
网络编程之udp学习之udp的多播(组播)和广播案例03
概述,关于多播,广播这些我Qt相关的文章 也有讲述过。https://blog.csdn.net/weixin_44517656/article/details/105950817 //ip相关知识https://blog.csdn.net/weixin_44517656/article/details/105959683 //多播与广播https://blog.csdn.net/weixin_44517656/article/details/105970733 //qt实现广播与组播案例1 多播原创 2021-02-09 11:39:56 · 523 阅读 · 0 评论 -
09libevent库服务端与客户端的TCP通信流程和代码示例
09libevent库服务端与客户端的TCP通信流程和代码示例1 服务端主要流程1 创建event_base()2 创建服务器连接监听器evconnlistener_new_bind()3 在evconnlistener_new_bind()的回调函数中,处理接受连接后的操作4 回调函数被调用,说明有一个新的客户端连接上来,会得到一个新的fd,用于跟客户端通信(读写)5 使用bufferevent_socket_new()创建一个新的bufferevent事件,将fd封装到这个事件对象中6 使原创 2020-09-24 20:39:47 · 942 阅读 · 2 评论 -
08libevent库下通信服务端与客户端的主要函数
08libevent库下通信服务端与客户端的主要函数1 服务端的主要函数1)evconnlistener_new(),该函数了解一下即可,它的功能相当于new一个监听者对象而已,并无实际封装,你看参6fd就知道,仍然需要自己socket()的返回值传参。所以主要用下面那个。 struct evconnlistener * evconnlistener_new( struct event_base *base,原创 2020-09-24 20:22:51 · 266 阅读 · 0 评论 -
07libevent库下bufferevent事件的相关函数
07libevent库下bufferevent事件的相关函数头文件为:#include <event2/bufferevent.h>1 bufferevent事件的创建注意,bufferevent也是一个事件,你也可以将下面理解为创建bufferevent的套接字。struct bufferevent * bufferevent_socket_new( struct event_base *base,原创 2020-09-23 22:48:03 · 328 阅读 · 0 评论 -
06libevent下通信中bufferevent缓冲区的特性介绍
06libevent下通信中bufferevent缓冲区的特性介绍1 bufferevent缓冲区的特性介绍我们知道,socket网络通信套接字是带有两个缓冲区的,分为读写缓冲区,例如服务端客户端共四个缓冲区。而bufferevent事件对象也是用于socket网络通信的,所以每一个bufferevent对象也是带有两个缓冲区,即读写缓冲区。2 图片解释对上面的图进行解释:当我们监听了该事件的读写后,读事件被触发时,读缓冲的回调函数被触发,我们只需要在该回调函数中用bufferevent_rea原创 2020-09-23 22:00:21 · 435 阅读 · 0 评论 -
05libevent库下未决与非未决的解释
05libevent库下未决与非未决的解释1 概念解释未决:有资格被处理,但还未被处理。非未决:没有资格被处理。2 结合libevent库的函数来解释,看图由于比较懒,就来得再重新画一幅了,直接看我的截图就好了。基本是能看清的。这里解释一下,例如创建新事件后,由于还没加到base监听,所以是不可能发生的,故为非未决状态,其它道理一样就不哆嗦了。...原创 2020-09-23 21:40:44 · 343 阅读 · 0 评论 -
04libevent库下fifo作为通信的套接字
04libevent库下fifo作为通信的套接字前言:这里为什么要准备这个例子是要说明libevent库不只只能用在网络通信当中即socket返回的fd;也可以用在本地返回的套接字,例如现在要说的fifo返回的本地套接字fd,此外本地套接字还可以是文件、mmap、信号等等。理解下面代码的前提:1)管道:管道是一个单向的数据流动,一边是读的话,另一边肯定是写。2)读端创建了管道后,当前路径会有一个管道文件名,并且写端不需要在创建,只需要打开即可。3)测试时,先启动读端,因为我们在代码上控制是读端中创原创 2020-09-23 21:18:24 · 248 阅读 · 0 评论 -
03libevent下通信的主要函数
03libevent下通信的主要函数以下的函数以框架的顺序来说明。1 主要函数及参数说明1)创建一个event_base// 创建event_basestruct event_base* event_base_new(void)2)创建一个普通event// 创建新事件 struct event *event_new( struct event_base *base, //上面创建的base evutil_socket_t fd, // 绑定到event上的文件描述符 - in原创 2020-09-22 22:59:10 · 217 阅读 · 0 评论 -
02libevent库的整体框架思想
02libevent库的整体框架思想思想:所见皆事件,类比Linux,所见皆为文件。所以有的事件响应都是基于回调函数实现;例如事先先设定回调函数,当某个事件满足后,内核自动帮你调用注册的回调。’1 libevent整体框架1)创建event_base,类似乐高底座。函数为struct event_base* event_base_new(void);2)创建事件。包括普通事件event和用于socket通信的缓存事件bufferevent。event_new();bufferevent_so原创 2020-09-22 22:04:23 · 286 阅读 · 0 评论 -
01libevent库的下载与安装并且测试是否安装成功
01libevent库的下载与安装并且测试是否安装成功libevent库的优点开源,精简,跨平台(Linux,Windows,Max…),专注于网络通信。以下的步骤都是基于LInux。1 下载与安装并且测试是否安装成功1)先从官网下载安装包到你想要的目录。参考README。 2) 解压tar -zxvf xxx.gz3)检测安装环境,例如内存空间是否足够,生成makefile./configure 4)生成.o文件和可执行文件make 5)将必要的资源安装到系统的指定目录s原创 2020-09-20 23:02:47 · 1891 阅读 · 0 评论 -
网络编程之本地套接字和网络套接字比较与本地套接字通信案例01
1 socket IPC(本地套接字domain)1.1 本地通信的方法1)pipe,mkfifo,两者实现最简单。2)mmap 非血缘关系进程间。3)信号,开销小。4)domain,稳定性最好。注意,在本节domain称之为本地套接字。与之对应的是网络套接字,两者需要区分一下。1.2 本地套接字domain注意点socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket。虽然网络socket也可用于同一台主机的进原创 2021-02-08 18:32:56 · 932 阅读 · 0 评论 -
网络编程之udp学习之udp实现的高并发服务器(借助tcp的c/s模型,实现udp的c/s模型)02
1 概述udp的高并发服务器非常简单,因为不需要连接,所以我们服务器做好后,客户端只需要往服务器中发送数据即可,无论多少个客户端,都能发送数据,能不能处理就看服务器的处理能力。这样就实现了高并发。2 代码server.c#include <string.h>#include <stdio.h>#include <unistd.h>#include <arpa/inet.h>#include <ctype.h>#define SE原创 2021-02-08 11:09:54 · 945 阅读 · 0 评论 -
网络编程之udp学习之udp与tcp的优缺点01
1 udp与tcp的优缺点1)TCP: 面向连接的可靠数据包传递 ---完全弥补 优点: 1. 数据稳定 --- 丢包回传(回执机制)(丢包率97‰)。 2. 速率稳定。 3. 流量稳定 “滑动窗口”。 缺点: 效率低、速度慢。 使用场景:大文件、重要文件传输等要求稳定的场合。2)UDP: 无连接的不可靠报文传递。----完全不弥补 缺点:不稳定:数据、速率、流量。 优点:效率高、速度快。 使用场景:对实时性要求较高,视频会议、视频电话原创 2021-02-08 10:47:37 · 283 阅读 · 0 评论 -
04线程池完整的头文件和实现文件(.c)
04线程池完整的头文件和实现文件(.c)前提:这里的线程池是基于Linux下C的实现,且在任务的回调函数中只是模拟工作,具体业务需要自己根据实际编写。这里可以举个例子,当客户端请求过来,我们可以将建立好的通信套接字通过任务的void* arg传进来,这样我们就可以在子线程中与客户端进行交互,极大的减少服务器主线程的工作压力。1 头文件#ifndef __THREADPOOL_H_#define __THREADPOOL_H_typedef struct threadpool_t threadpo原创 2020-09-20 11:37:50 · 554 阅读 · 0 评论 -
03线程池的各个函数解析
03线程池的各个函数解析1 业务层逻辑分析main函数中比较简单,就是创建线程池,然后往池里添加任务,等待处理完成后销毁线程池。下面会根据main的调用顺序来逐步解析各个函数的作用。/* 线程池中的线程,模拟处理业务 */void *process(void *arg){ printf("thread 0x%x working on task %d\n ",(unsigned int)pthread_self(),*(int *)arg); sleep(1); print原创 2020-09-20 11:28:21 · 545 阅读 · 0 评论 -
02线程池的结构体描述信息
02线程池的结构体描述信息01线程池原理剖析02线程池的结构体描述信息直接看代码,代码里有详细的注释。//描述任务队列的结构体typedef struct { void *(*function)(void *); /* 函数指针,回调函数 */ void *arg; /* 上面函数的参数 */} threadpool_task_t; /* 各子线程任务结构体 *//* 描原创 2020-09-20 11:12:22 · 188 阅读 · 0 评论 -
01线程池原理剖析
01线程池原理剖析1 为何需要线程池?我们知道,多路IO转接是可以支持多个客户端的连接与处理,举例poll解释,他可以一次监听到多个客户端请求返回,并遍历confd数组进行处理,也就是说,Server是直接进行处理的;再看epoll,他是有请求就给你建立连接,并且设置为非阻塞是非常高效的,不需要立马就处理请求。因为它有回调函数帮忙进行处理,但实际上仍然是Server自己处理。如果客户端非常活跃的情况下,导致很多回调函数处理,也是非常耗时的,所以epoll比较支持多连接,少活跃的情况。那么我们能不能建立原创 2020-09-19 23:18:36 · 162 阅读 · 0 评论 -
网络编程之IO复用机制(多路IO转接)之epoll反应堆11
1 epoll反应堆过程这里简单说明一下,我们只需要清楚,当cfd读事件满足,然后read,接着下树。改成监听写事件,再上树,当cfd的写事件满足,然后write,接着下树改会监听读事件,一直循环即可。下面的图就是这个思想。2 epoll反应堆案例2.1 案例前了解在将案例前,我们首先明确我们想要操作的数据结构。由于epoll操作的都是树节点,节点类型为struct epoll_event,所以我们操作epoll_event,因其成员有data,所以我们操作data(events是事件所以不需要操原创 2021-02-05 15:00:25 · 158 阅读 · 0 评论 -
网络编程之IO复用机制(多路IO转接)之epoll的思路图分析10
1 epoll的思路图分析epoll的思路图很简单,首先将保存lfd的节点即struct epoll_event类型的结构体放到红黑树上监听,有多少个客户端连接,我们就往树上挂即可。操作也比起select,poll简单,代码实现也不难,特别是与select相比,编码难度大大减低。...原创 2021-01-31 20:23:19 · 98 阅读 · 0 评论 -
网络编程之IO复用机制(多路IO转接)之epoll的ET非阻塞09
1 epoll的ET非阻塞案例本篇也只是先简单描述epoll的ET非阻塞,真正的分析后面是详解epoll的ET非阻塞即epoll反应堆模型。案例:同样与上一篇案例类似,为了方便测试,我们服务器不将lfd挂上树,只将cfd挂上树,使服务器只能接收一个客户端的连接(实际上一个以上也可以连接但是我们没有处理而已)。然后客户端写(客户端代码还是上一篇保持不变),服务端每次读5字节,但是由于服务器是ET模型,每次写只能触发一次epoll_wait返回,所以我在读的时候轮询读取,这样就能把管道剩余的数据读走,并且将原创 2021-01-31 20:02:40 · 105 阅读 · 0 评论 -
网络编程之IO复用机制(多路IO转接)之使用网络套接字验证epoll的LT和ET08
概述:上一篇我们使用了本地的进程间通信管道去验证epoll的LT和ET模型。下面我们继续使用网络套接字去验证epoll的LT和ET模型,这两篇文章都是为了验证epoll的两种模型,你可以挑一篇看即可,代码无需死记,因为作用不大,主要还是起验证作用。1 使用网络套接字验证epoll的LT和ET1.1 epoll的LT,ET模型是否阻塞和非阻塞总结同样像上一篇一样,先总结epoll的两种模型。1)epoll的LT模型支持阻塞和非阻塞。2)epoll的ET模型只支持非阻塞,不支持阻塞。1.2原创 2021-01-31 19:21:53 · 152 阅读 · 0 评论 -
网络编程之IO复用机制(多路IO转接)之使用管道验证epoll的LT和ET07
1 阻塞与非阻塞,LT与ET概念1)我们知道,文件描述符(例如管道,套接字等等)具有阻塞与非阻塞,例如套接字,当我们使用read去读取内容时,由于套接字默认是阻塞的,所以当没有内容时,read就会阻塞,这就是read读取阻塞的根本原因。所以阻塞就是卡住,非阻塞就是不卡住,这是最简单的理解。2)而Level Triggered (LT)和Edge Triggered (ET) 两者,前者是水平出发,只要有数据就会读取。后者是边沿触发,只有电平改变才会触发,电平改变就是0变成1(上升沿)或者1变成0(下降原创 2021-01-31 14:47:22 · 182 阅读 · 0 评论 -
网络编程之IO复用机制(多路IO转接)之epoll_create,epoll_ctl,epoll_wait函数06
1 epoll_create函数epoll_create是创建一个epoll句柄,参数size用来告诉内核监听的文件描述符的个数,跟内存大小有关。#include <sys/epoll.h>int epoll_create(int size) size:监听数目/*** 返回值:成功返回监听红黑树的根节点。失败返回-1。* 参1:想要本程序最大的监听文件描述符个数例如你想监听10000就传10000。但是仅供内核参考,不一定有效。**/2 epoll_ctl函数控制某个e原创 2021-01-31 11:03:44 · 193 阅读 · 0 评论 -
网络编程之IO复用机制(多路IO转接)之突破文件描述符上限05
1 查看本机一个进程最大的socket描述符上限可以使用cat命令查看一个进程可以打开的socket描述符上限。cat /proc/sys/fs/file-max下面结果就是你的计算机最大可以打开的文件描述符上限,因为我的虚拟机是12.04很久的测试机,所以就是十万左右,比较低。2 修改一个进程可以打开的socket描述符上限上面我们说了一个计算机可以最大打开的文件描述符,注意上面的值确实是已经是最大的打开值,但是我们可以认为的在[0,101026]这个范围去调整一个进程最大的上限。但一般不需原创 2021-01-29 22:30:16 · 259 阅读 · 1 评论 -
网络编程之IO复用机制(多路IO转接)之poll04
1 poll函数原型#include <poll.h>int poll(struct pollfd *fds, nfds_t nfds, int timeout);/** 功能:实现多路IO复用。 返回值:返回实际的满足事件的个数,负数为poll监听出错。 参1:fds,通常传的是一个pollfd类型的数组。 struct pollfd { int fd; /* 文件描述符 */ short events; /* 监控的事件 */ short revents; /*原创 2021-01-28 21:32:05 · 118 阅读 · 0 评论 -
网络编程之IO复用机制(多路IO转接)之select实现IO复用的代码实现03
1 思路图上一篇我们说过了select的代码思路,如果你清楚的话可以不看。但是这个图还是很有必要去了解的,虽然select不建议深入。1)我们先看图一,图一是我们调用accept去进行通信的最简单的例子。我们知道,accept函数每一次只能与一个客户端进行建立连接,要想与多个客户端进行连接,必须开启多个server,所以这是不符合我们的需求的。2)所以,伟大的程序员们就想到了IO复用机制即select,poll,epoll去借助内核帮我们实现一个server与多个客户端连接并进行通信。本节只讲sel原创 2021-01-27 23:42:52 · 179 阅读 · 0 评论 -
网络编程之IO复用机制(多路IO转接)之select实现IO复用的思路02
1 select实现IO复用的思路02下面的都是伪代码,主要讲究思路。1)lfd=socket()。2)bind()。3)listen()。4)将lfd添加到select的读集合用于传入,借助内核帮我们监听事件,而不直接调用accept函数监听。为了方便我们只需要添加读集合即可。fd_Set rset,allset;//rset为读监听的集合FD_ZERO(&rset);FD_SET(lfd,&rset);5)调用select函数实现IO复用。int ret =原创 2021-01-24 23:55:55 · 134 阅读 · 0 评论 -
网络编程之IO复用机制(多路IO转接)之select函数原型及其相关函数01
概述:1)select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符个数并不能改变select监听文件个数。2)2.解决1024以下客户端时使用select是很合适的,但如果链接客户端过多,select采用的是轮询模型,会大大降低服务器响应效率,不应在select上投入更多精力,只能作为入门网络编程的起始阶段。1 select函数原型相应的头文件。#include <sys/select.h>/* According to earl原创 2021-01-24 23:04:49 · 109 阅读 · 0 评论