网络编程
天健园扛把子
兴趣遍地都是,专注和持之以恒才是真正稀缺的。
展开
-
select,poll,epoll区别
什么时候socket可读socket内核中,接受缓冲区的字节数大于等于低水位标志SO_RCVLOWAT,此时调用 recv 或 read 函数可以无阻塞的读该文件描述符, 并且返回值大于0;TCP 连接的对端关闭连接,此时调用 recv 或 read 函数对该 socket 读,则返回 0;侦听 socket ...原创 2019-04-24 20:33:26 · 404 阅读 · 1 评论 -
半同步半异步进程池的实现
进程池的基本思想由主进程管理所有监听socket,而各个子进程分别管理属于自己的连接的socket,子进程可以自己调用accept来接受新连接,这样父进程就无需向子进程传递socket,而只需要简单的说一声."我检测到了有新的连接,你来接受一下“进程池的代码逻辑每个进程类都有一个m_pid用来标识自己,还有一个管道成员来统一信号源,处理信号事件进程池类使用单例模式创建,其构造函数为pri...原创 2019-05-23 08:43:08 · 442 阅读 · 3 评论 -
半同步半异步模式
同步和异步的区别在IO模型中:同步和异步的区分在于内核向应用程序通知的是和种IO事件,同步模式下通知的是就绪事件,异步通知的是完成事件,以及到底是谁来完成I/O读写,同步模式下由应用程序来I/O读写完成,而异步模式下由内核帮我们完成I/O读写。在并发模型中:同步指的是程序完全按照代码的顺序执行;异步指的是程序的执行需要由系统事件来驱动,比如中断,信号等等。同步异步的优缺点按同步方式运行的线...原创 2019-05-22 17:52:00 · 720 阅读 · 0 评论 -
TCP聊天室-简易版
参考于Linux高性能服务器编程,并对代码进行了深度剖析。服务端使用IO多路复用技术实现多个用户连接,主要功能是负责接受客户的数据,并将客户的数据发送给每一个登陆到该服务器上的客户端。服务端代码#include <sys/types.h>#include <arpa/inet.h>#include <netinet/in.h>#include &l...原创 2019-05-17 11:44:20 · 340 阅读 · 0 评论 -
TCP服务和UDP服务的同时处理
前言在实际的生产环境中,我们的服务程序往往需要同时监听多个端口,从bind系统调用的参数我们知道,一个socket只能与一个socket地址相绑定,即一个socket只能用来监听一个端口。因此要监听多个端口就需要创建多个socket,并将它们分别绑定多个端口,通过IO复用进行监听多个socket.引入通过刚才的介绍我们可以知道,即使是同一个端口,如果服务器要同时监听TCP和UDP请求,则也需...原创 2019-05-16 14:37:39 · 1542 阅读 · 0 评论 -
非阻塞connnect的使用
前言一般来说,在TCP建立连接的过程中,我们的客户端使用connect发起连接,默认使用的是阻塞模式,只有在有明确结果的时候才会返回(连接成功或连接失败)。这样可能照成当我们向一个“比较远”的服务器发起连接时,我们的程序会阻塞在connect好几秒,这并不是我们想要看到的,如果解决这种问题呢?引入正是由于阻塞connect可能照成上述问题,所以在实际项目中我们一般使用非阻塞connect来解...原创 2019-05-16 10:48:21 · 768 阅读 · 0 评论 -
EPOLLONESHOT事件
前言即使使用ET模式,一个socket上的同一事件还是可能被触发多次(将TCP缓冲区设置的小一点,发送一个较大的数据,接受的数据会多次填满缓冲区,导致会被触发多次),,当某个线程在读取完某个socket的数据后开始处理这些数据,但在处理这些数据的时候这个socket上又有数据来了,此时另外一个线程被唤醒来读取这些新的数据,于是出现了两个线程同时操作一个socket的局面。但我们期望一个socke...原创 2019-05-16 09:55:39 · 448 阅读 · 0 评论 -
定时器
前言网络程序一般需要处理的时间有三类:I/O事件,信号事件,定时事件。在上一章我们学习了通过同一事件源对IO事件和信号事件的统一处理,在这章我们将学习对定时事件的统一处理。一般来说我们要将每个定时事件分别封装为定时器,并通过某种数据结构来将所有的定时器串联起来,常见的高性能定时器有时间轮和时间堆。定时方法Linux提供了三种定时方法:socket选项SO_RECVTIMO和SO_SNDT...原创 2019-05-20 19:13:58 · 191 阅读 · 0 评论 -
信号的统一处理
前言在学习APUE的过程中接触过信号,但往往是对API的了解,以及这些API的简单使用,并没有考虑到其在真实实践中的用法。在系统编程阶段我们可以知道信号是一种异步事件,信号处理函数和主循环是两条不同的执行路线,我们希望信号处理函数能够尽可能快地执行完,以确保信号不会被屏蔽太久。(因为这样可能会引发一些竞态条件),在实际项目中是如何做到的呢。解决一般来说把信号的主要处理逻辑放在主循环,而不是信...原创 2019-05-18 10:27:20 · 189 阅读 · 0 评论