
网络编程
文章平均质量分 82
以《Linux高性能服务器编程》参考资料,介绍高性能服务器编程之精髓
liuxuejiang158
做点笔记,省的百度不到。。。
展开
-
定时事件
当服务器遇见一些idle连接的时候需要及时处理它们以保证资源的充足性,需要定期检测连接是否处于活动状态。每个连接一个定期事件,事件可能非常多,因此需要将这些时间组织起来,这些事件在预期时间达到时触发某种处理机制而不影响服务器的主要逻辑。每个定时事件封装为定时器,然后将这些定时器用某种容器统一管理(添加定时器、删除定时器、激活定时机制等)。前一篇博文的《非阻塞connect》是通过在socket描述原创 2013-10-12 17:35:10 · 2117 阅读 · 0 评论 -
内存共享实现聊天室程序
聊天室程序中至少要求每个用户的发言能立即呈现给其它用户,为了提高效率,每个用户连接在服务端都对应一个子进程处理该用户连接。所有用户的发言数据记录在一个用户共享内存中,假设A用户发言了那么共享内存中某段数据t对应A的发言数据,用户B对应的子进程是pid_b处理用户B,那么pid_b只要到到共享内存位置t读取A的发言数据并发送给B,则聊天室逻辑就成立了。为了达到该设计需求,服务端主进程监听端口遇见有用原创 2013-10-14 23:53:21 · 2782 阅读 · 1 评论 -
半同步/半异步进程池实现服务端程序
半同步/半异步模式中一个主进程处理客户连接,其它子进程处理客户连接的具体逻辑。这里将实现一个线程池用于服务端处理客户连接,服务端一个主进程专门用于处理客户连接请求但是并不accept,而子进程专门用于accept并一直处理这个连接的逻辑。#ifndef PROCESSPOOL_H#define PROCESSPOOL_H#include #include #include #i原创 2013-10-17 23:48:13 · 1913 阅读 · 0 评论 -
进程池实现客户端连接请求程序
服务端通过进程池实现处理并发连接逻辑:服务端主进程先创建进程池(这里没有显示给出进程池类但是逻辑上是采用多个子进程模拟进程池),服务端监听端口若有连接请求则服务端将连接请求分发给子进程(简单的循环分发),子进程收到父进程的指示(有新的客户连接请求要你处理)时建立该客户连接并再fork子进程处理客户端的连接处理逻辑。#include #include #include #include原创 2013-10-19 13:42:30 · 1944 阅读 · 0 评论 -
基于半同步/半反应堆线程池实现的HTTP解析服务端程序
简介: 半同步/半反应堆线程池是通过一个线程往工作队列添加任务T,然后工作线程竞争工作队列获得任务T。HTTP请求解析服务端程序:逐行解析客户端发送来的HTTP请求然后作出HTTP回答。采用线程池就是:服务端创建一个线程池,然后有HTTP请求到达就将HTTP请求的处理添加到线程池任务队列中去,线程池工作线程通过竞态机制(信号量)竞争任务T(HTTP请求处理)。 HTTP请求内容原创 2013-10-19 17:19:36 · 4122 阅读 · 3 评论 -
超时connect
sock选项SO_SNDTIMEO和SO_RCVTIMEO可以用来发送和接收超时时间,对于设置了以上选项的socket描述符,connect具有超时连接功能即在指定的时间内为连接会返回-1并置errno为EINPROGRESS具有超时connect功能的客户端代码:#include#include#include#include#include#include#includ原创 2013-10-10 14:00:28 · 2013 阅读 · 0 评论 -
带外数据的接收与发送
带外数据比普通数据具有更高的优先级,TCP没有真正的带外数据,而是提供了一个我们要讨论的紧急模式,TCP将数据放置在套机口发送缓冲区的下一个可用位置,并设置这个连接的TCP紧急指针(urgent pointer)为下一个可用位置,TCP紧急指针有一个比用MSG_OOB标志写入的数据多一个字节的序列号。由于接收端的带外缓冲只有1B所以发送端发送的多字节带外数据只有最后1B被当做带外数据,若接收端原创 2013-10-10 11:02:48 · 4447 阅读 · 1 评论 -
统一事件源
信号是一种异步事件,将其和IO事件统一起来交给主程序处理叫做统一事件源,一般方法是:信号处理函数将信号值写到管道一端,然后主程序采用IO复用技术监听管道读端,一旦可读事件发生那么主程序可以在事件处理逻辑中定义信号处理方法,这样就和IO事件处理一只。服务端统一事件源程序:#include#include#include#include#include#include#incl原创 2013-10-10 09:43:10 · 3134 阅读 · 0 评论 -
IO复用高级应用:同时处理TCP和UDP服务
一个socket只能与一个socket地址绑定即一个socket只能监听一个端口,服务器如果要同时监听多个端口就必须创建多个socket,若在同一个端口监听多个服务也要创建多个socket绑定到这个端口上。现在服务器监听一个端口上的TCP和UDP请求,并将发送来的数据回射到客户端。服务端程序:#include #include #include #include #includ原创 2013-10-09 15:03:28 · 4171 阅读 · 1 评论 -
高级IO复用应用:聊天室程序
简单的聊天室程序:客户端从标准输入输入数据后发送给服务端,服务端将用户发送来的数据转发给其它用户。这里采用IO复用poll技术。客户端采用了splice零拷贝。服务端采用了空间换时间(分配超大的用户数据数组,然后通过用户连接的文件描述符即可以索引到用户数据)客户端程序:#define _GNU_SOURCE 1//为了支持POLLRDHUP事件#include#include#i原创 2013-10-09 13:55:56 · 2759 阅读 · 2 评论 -
非阻塞connect
通常的socket描述符的阻塞式的,connect连接时可能出现长时间没有连接成功的情形,若将socket描述符设置为非阻塞,那么调用connect后三次握手还可能没有完全建立connect立即返回EINPROGRESS,这个过程中可以设置超时等待或者做其它的事情。非阻塞式有3种用途: 1.三次握手同时做其他的处理。connect要花一个往返时间完成,从几毫秒的局域网到几百毫秒原创 2013-10-09 10:45:11 · 2280 阅读 · 0 评论 -
select、poll、epoll三组IO复用
int select(int nfds,fd_set* readfds,fd_set* writefds,fd_set* exceptfds,struct timeval* timeout)//其中nfds是被监听的文件描述符总数通常设置为所有文件描述符中的最大值加一(是否可以理解为凡是小于这个描述符的都要被轮询?,加1是因为文件描述符从0开始计数),readfds、writefds、except原创 2013-10-08 14:40:59 · 2230 阅读 · 0 评论 -
EPOLLONESHOT事件
epoll模式中事件可能被触发多次,比如socket接收到数据交给一个线程处理数据,在数据没有处理完之前又有新数据达到触发了事件,另一个线程被激活获得该socket,从而产生多个线程操作同一socket,即使在ET模式下也有可能出现这种情况。采用EPOLLONETSHOT事件的文件描述符上的注册事件只触发一次,要想重新注册事件则需要调用epoll_ctl重置文件描述符上的事件,这样前面的socke原创 2013-10-08 11:19:55 · 9630 阅读 · 5 评论 -
epoll的LT和ET模式
epoll是IO复用技术本身是阻塞模式,但是其能同时监听多个文件描述符因此能达到并发的效果,epoll的两种模式LT和ET二者的差异在于level-trigger模式下只要某个socket处于readable/writable状态,无论什么时候进行epoll_wait都会返回该socket;而edge-trigger模式下只有某个socket从unreadable变为readable或从u原创 2013-10-04 21:11:48 · 3846 阅读 · 1 评论 -
CGI原理
服务端将标准输出关闭并理解调用dup复制该文件描述符到socket上,则客户端收到的是服务端的标准输出流服务端程序:#include#include#include#include#include#include#include#include#include#includeusing namespace std;int main(int argc,char* arg原创 2013-09-28 22:01:39 · 1810 阅读 · 0 评论