![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux高性能服务器编程
文章平均质量分 71
explore翔
安徽某985小硕,记录日常学习生活,欢迎大家交流指教。
展开
-
定时器
网络程序需要处理的第三种事件是定时事件。(其余两种是I/O事件和信号事件)。比如定期检查一个客户连接的状态。定时的方法定时也就是一段时间之后触发某段代码的机制。LINUX提供了三种定时方法:socket选项:SO_RCVTIMEO,SO_SNDTIMEO.SIGALRM信号I/O复用调用超时函数。1.SO_RCVTIMEO,SO_SNDTIMEO:分别用来设置接收数据超时时间和发送数据超时时间,所以它只对和发送接受数据相关的socket有效,比如send,recv,accept,connect。原创 2021-05-18 20:28:08 · 86 阅读 · 0 评论 -
信号
信号是由用户、系统、进程发送给目标进程的信息,以通知目标进程某个状态的改变或系统异常。Linux信号可以由如下条件产生:1、对于前台进程,用户可以输入终端字符来给它发送信号。比如ctrl+c为中断信号;2、系统异常。比如浮点异常或非法内存段访问;3、系统状态变化,比如alarm定时器到期引起SIGAALAM信号;4、运行kill命令;1、发送信号其中sig一般大于0,0代表不发送任何信号。2.信号处理方式整形参数代表了信号类型。信号处理函数是可重入的,我们在信号处理函数中要注意不要调用不原创 2021-05-04 11:58:47 · 136 阅读 · 0 评论 -
I/O复用(2)----常见的应用
1、聊天室程序像ssh这样的登录服务通常要同时处理网络连接和用户输入,这可以用I/O复用实现。我们尝试用poll实现简单的聊天室程序,可以让所有用户实现在线群聊。客户端功能主要是从标准输入端读入数据,并将数据发送至服务器,并打印出服务器发送给他的数据。服务器端功能主要是接受客户数据,并把数据发送至登录到该服务器的每个客户端(发送数据者除外)。感觉是个挺有趣的实验。下面我们会给出源码并分析:1、客户端客户端使用poll同时监听用户输入和网络连接,并利用splice函数将用户输入内容直接定向到网络连接上原创 2021-04-29 20:33:57 · 151 阅读 · 0 评论 -
I/O复用(1)
I/O复用使程序可以监听多个文件描述符,这对提高程序性能至关重要。通常在以下情形中,需要用到该技术:1.客户端程序要同时处理多个socket,比如本文要讨论的非阻塞connect技术;2、客户端程序要同时处理用户输入和网络连接,比如下面要说的聊天室程序;3 TCP服务器要同时处理监听socket和连接socket。这也是I/O复用使用最多的场合;4、服务器要同时处理TCP请求和UDP请求,比如回射服务器;5、服务器要同时监听多个端口。我们要注意,虽然I/O复用可以同时监听多个文件描述符,但它本身转载 2021-04-27 22:55:19 · 90 阅读 · 0 评论 -
高性能服务器程序框架
这一章可以说是核心了,因为前面说了一些基础知识,这里将要讲述如何搭建一个高性能服务器。我们将服务器分解为以下三个模块:I/O处理单元,逻辑单元,存储单元。本章介绍前两个,存储单元是可选的模块,跟网络编程本身无关;1.服务器模型C/S模型虽然TCP/IP协议在设计和实现上没有客户端和服务端的概念,但是资源的垄断意味着我们必须从某台机器获取信息,所以几乎所有的网络应用服务都采取了C/S模型。这个模型实现也很简单,服务器端创建一个多个socket监听,bind,listen,客户端有请求就通过selec原创 2021-04-25 15:59:03 · 123 阅读 · 0 评论 -
Linux服务器程序规范
除了网络通信外,服务器程序还会考虑其它问题,十分零碎且广泛。并且已经形成了一套规范;1.日志系统我们知道,日志系统对于服务器的调试和维护至关重要。那么,linux提供了一个守护进程syslogd来处理系统日志,现在用的都是它的升级版rsyslogd。rsyslogd既能够接受用户进程输出的日志,也可以接受内核输出的日志。用户进程是通过调用syslog函数来生成日志,该日志将保存到UNIX类型的文件/dev/log中。rsyslogd就是监听这个文件以获取输出的日志。内核日志可以由printk函数打原创 2021-04-24 20:01:45 · 122 阅读 · 0 评论 -
高级I/O函数
LINUX提供了很多高级的I/O函数,我们介绍和网络编程相关的几个,在特定情况下可以产生很高的性能。主要分为3类:1、创建文件描述符的函数,pipe,dup,dup2函数;2、读写数据的函数,readv,writev,sendfile,mmap,munmap,splice,tee函数;3、用于控制I/O行为和属性的函数,fcntl()函数。1、pipe函数pipe用于创建一个管道实现进程间通信。这里只介绍基本使用。参数是包含两个int型整数的数组指针。(数组指针只是一个指针变量,它占有内存中一原创 2021-04-21 14:44:36 · 147 阅读 · 0 评论 -
5.Linux网络编程基础API
这一章可能和之前TCP/IP网络编程有部分重合,就当复习巩固了,并且取长补短。1、主机字节序和网络字节序这个问题怎么产生呢。我们知道现在的32位机器的CPU累加器一次至少装载4个字节,也就是一个int类型。那么这4个字节的在内存中的排列顺序将影响他被累加器装载成的值。这就是字节序问题。字节序又被分为大端和小端两种。大端指的是数据的高位字节存储在内存的低地址中,小端反过来。而在PC机中,大多采用小端字节序(主机字节序)。所以我们就知道了我们平时取地址&a,取的是内存的最低地址的那个字节,里面存的原创 2021-04-20 14:59:59 · 123 阅读 · 0 评论 -
TCP/IP协议族
我们今天开始学习linux高性能网络编程。TCP/IP协议族是必须了解的基础知识,即包括哪些协议,以及他们如何协作进行工作。整体结构:1、数据链路层原创 2021-04-02 11:38:45 · 114 阅读 · 0 评论