![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
UNIX网络编程
文章平均质量分 75
jiange_zh
linux 网络编程 C++ 算法 数据结构
展开
-
《UNIX网络编程》TCP网络编程基础(1)
最近发现只看书不打代码真的不行,所以还是决定自己把代码敲一遍,加深印象!实验内容:服务器和客户端通过tcp通信;客户端从标准输入获得字符串,发送给服务器;服务器统计收到的字符串长度,将结果返回给客户端;客户端显示服务器返回的结果。源代码:/* * tcp_server.c */#include <stdio.h>#include <stdlib.h>#include <strings.h>原创 2015-12-29 14:54:02 · 628 阅读 · 0 评论 -
【slighttpd】基于lighttpd架构的Server项目实战(9)—状态机
上一节中,我们简单回顾了lighttpd的状态机机制,在本节中,我们将把状态机机制引入到我们的项目当中~我们的状态机大体上效仿lighttpd的状态机,不过有一些改动:typedef enum{ CON_STATE_CONNECT, CON_STATE_REQUEST_START, CON_STATE_READ, CON_STATE_REQUEST_END,原创 2016-02-09 21:46:46 · 1872 阅读 · 0 评论 -
【slighttpd】基于lighttpd架构的Server项目实战(4)—简单的echo服务器
在这一部分,我们将对上一篇中的master-worker进行拓展,成为一个简单的echo服务器。这一步我们需要添加两个类:Listener和Connection;Listener的职责:创建监听套接字;注册监听套接字事件;在监听事件的回调函数中进行accept并创建新连接;其头文件如下:/****************************************************原创 2016-02-04 23:23:45 · 1465 阅读 · 0 评论 -
【slighttpd】基于lighttpd架构的Server项目实战(10)—插件&动态库
上一节我们介绍了状态机,本节我们将添加插件模块,之后就可以根据公共接口来开发插件,而我们的server则只需要通过状态机调用相应阶段的公共函数,无需关心插件的实现细节。我们的插件将以动态库so的形式来加载。插件我们的插件类将作为一个基类,成员函数作为虚函数,之后由插件开发者继承、实现。本项目的插件接口对应于状态机的阶段,每个阶段提供一个函数:/****************************原创 2016-02-12 13:45:52 · 2051 阅读 · 0 评论 -
Lighttpd1.4.20源码分析 笔记 数据结构的组织
我们看源文件,可以看到一些前缀了data_的文件: data_array.c、data_config.c、data_count.c、data_fastcgi.c、data_integer.c、data_string.c, 这些文件实现的是 lighttpd 的数据结构部分。 可以看到它们内部都包含了array.h。结构体定义在 array.h 头文件内有几个结构体定义: data_unset、原创 2016-01-09 23:55:16 · 1157 阅读 · 0 评论 -
Lighttpd1.4.20源码分析 笔记 网络服务主模型
一.概述Lighttpd采用多进程网络服务模型。进程分两种:监控进程watcher 和 工作进程 workers。监控进程:fork工作进程并监视工作进程的数目,一旦有工作进程退出,监控进程立即fork新的工作进程。工作进程:接收客户端请求并做出服务响应。一般情况下,存在一个监控进程和多个工作进程。max-worker值默认为0时,没有监控进程,只有一个工作进程。关于初始化:Lighttpd很多地方原创 2016-01-08 15:12:56 · 4141 阅读 · 0 评论 -
Lighttpd1.4.20源码分析 笔记 fdevent系统-结构体及对外接口
fdevent系统主要是处理各种IO事件,在web服务器中,主要就是向socket写数据和从socket读数据。web服务器是IO密集型程序,因此,大部分的web服务器都采用非阻塞IO进行数据的读写。lighttpd通过fdevent系统,采用类似OO中面向对象的方式将对IO事件的处理进行封装,对于不同的IO系统,提供一个统一的接口。lighttpd采用了所谓的Reactor模式,也就是非阻塞IO加原创 2016-01-15 11:00:07 · 1269 阅读 · 0 评论 -
Lighttpd1.4.20源码分析 笔记 fdevent系统-初始化
C程序在进行真正的编译之前都要进行预编译。我们看看fdevent系统中的一些宏:#if defined(HAVE_EPOLL_CTL) && defined(HAVE_SYS_EPOLL_H)# if defined HAVE_STDINT_H# include <stdint.h># endif# define USE_LINUX_EPOLL# include <sys/epoll.h原创 2016-01-15 11:30:19 · 1117 阅读 · 0 评论 -
Lighttpd1.4.20源码分析 笔记 fdevent系统-事件处理
我们仍然从server.c的main函数开始。当完成fdevent的初始化之后,第一个需要fdevent处理的事情就是将在初始化网络的过程中得到的监听fd(socket函数的返回值)注册到fdevent系统中。该动作调用的是network_register_fdevents()函数,定义在network.c文件中:/** * 在fd events系统中注册监听socket。 * 这个函数在子进程原创 2016-01-15 13:27:45 · 1636 阅读 · 0 评论 -
select和epoll 原理概述&优缺点比较
这个问题在面试跟网络编程相关的岗位的时候基本都会被问到,刚刚看到一个很好的比喻:就像收本子的班长,以前得一个个学生地去问有没有本子,如果没有,它还得等待一段时间而后又继续问,现在好了,只走一次,如果没有本子,班长就告诉大家去那里交本子,当班长想起要取本子,就去那里看看或者等待一定时间后离开,有本子到了就叫醒他,然后取走。也许在细节方面不是特别恰当,但是总的来说,比较形象地说出了select原创 2016-03-06 08:49:10 · 33707 阅读 · 4 评论 -
UNIX网络编程——网络I/O模型
在学习UNIX网络编程的时候,一开始分不清 同步 和 异步,所以还是总结一下,理清下他们的区别比较好。IO分类IO根据对IO的调度方式可分为阻塞IO、非阻塞IO、IO复用、信号驱动IO、异步IO。IO操作整个流程分为 可操作判断 和 实际IO操作 两个区间,我们可以称之为两个半程,前半程判断是否可操作,后半程进行实际操作。其中阻塞IO、非阻塞IO、IO复用、信号驱动IO因为其【实际的IO操作是同步阻原创 2016-03-06 15:51:14 · 2316 阅读 · 0 评论 -
nginx架构初探
注:个人学习的一些知识点笔记参考:《Nginx开发从入门到精通》,《深入理解Nginx》1.nginx可以后台运行,也可以前台运行(一般用于调试);2.nginx支持多线程,只是我们主流的方式还是多进程的方式,也是nginx的默认方式;3.nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发原创 2016-01-11 14:11:57 · 880 阅读 · 0 评论 -
【slighttpd】基于lighttpd架构的Server项目实战(8)—状态机机制回顾
有限状态机FSM(Finite State Machine)关于状态机的一个极度确切的描述是它是一个有向图形,由一组节点和一组相应的转移函数组成。状态机通过响应一系列事件而“运行”。每个事件都在属于“当前” 节点的转移函数的控制范围内,其中函数的范围是节点的一个子集。函数返回“下一个”(也许是同一个)节点。这些节点中至少有一个必须是终态。当到达终态, 状态机停止。传统应用程序的控制流程基本是顺序的:原创 2016-02-06 15:10:05 · 3570 阅读 · 0 评论 -
【slighttpd】基于lighttpd架构的Server项目实战(7)—http-parser
对于http服务器,http request的解析是比较麻烦的,由于我们的重点并不在这上面,所以这一部分不打算自己编写,而是使用开源的http-parser库,下面我们将使用该库来构建项目中处理http的类。HTTP Parser简介http-parser是一个用C编写的HTTP消息解析器,可以解析HTTP请求或者回应消息。这个解析器常常在高性能的HTTP应用中使用。在解析的过程中,它不会调用任何系原创 2016-02-05 23:30:42 · 8164 阅读 · 0 评论 -
《UNIX网络编程》TCP网络编程基础(2)
在上一篇中,我们编写了一个简单的TCP服务器/客户端程序,初步探讨了一些问题,本文将进一步优化该程序,使我们的程序更加健壮。问题提出我们的服务器阻塞于accept时,如果被信号中断了,将会返回一个错误,有些内核会自动重启被中断的系统调用,但为了可移植性,我们必须对慢系统调用返回EINTR有所准备。服务器关闭后,客户端由于阻塞在read上,不能及时收到服务器关闭的通知.close存在两点限制(代原创 2015-12-29 20:20:20 · 492 阅读 · 0 评论 -
Lighttpd1.4.20源码分析 笔记 fdevent系统-连接socket及超时处理
上一篇我们探讨了lighttpd对监听socket的处理,这次我们看看连接socket的处理,以及相关超时的处理。lighttpd和客户端建立连接的过程:1.lighttpd检测监听socket的IO事件,如果有可读事件发生,那么表示有新的连接请求,于是调用network.c/network_server_handle_fdevent()来处理连接请求。2.network_server原创 2016-01-15 23:34:48 · 1560 阅读 · 0 评论 -
《UNIX网络编程》UDP网络编程基础
udp是无连接的,对于服务器,它只需要创建套接字,并绑定到地址:端口上,然后等待接收消息到来,对于客户端,只需要创建套接字然后向服务器发送消息。udp服务器一般是迭代的。下面是一个使用udp的简单echo程序:/* *udp_server.c */#include <stdio.h>#include <stdlib.h>#include <strings.h>#include <sys/原创 2015-12-30 19:33:44 · 680 阅读 · 0 评论 -
Lighttpd1.4.20源码分析 笔记 状态机与插件
Lighttpd启动时完成了一系列初始化操作后,就进入了一个包含11个状态的有限状态机中。每个连接都是一个connection实例(con),状态的切换取决于con->state。lighttpd经过初步处理后将con的基本信息初始化,而插件对事件的处理就是针对con进行的,它拿到con后按照业务需要进行相应处理,然后再交还给lighttpd,lighttpd根据con中的信息完成响应。状态定义如下原创 2016-01-17 14:26:26 · 1340 阅读 · 0 评论 -
【网络编程】SYN Flood (SYN洪水攻击) 源代码分析
一.原理1、TCP握手协议第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包原创 2016-01-01 22:41:11 · 23072 阅读 · 22 评论 -
Webbench 源码分析 阅读笔记
一.简介Webbench是有名的网站压力测试工具,它是由 Lionbridge公司开发。Webbech能测试处在相同硬件上,不同服务的性能以及不同硬件上同一个服务的运行状况。webBech的标准测试可以向我们展示服务器的 两项 内容:每秒钟相应请求数和每秒钟传输数据量。webbench不但能具有便准静态页面的测试能力,还能对动态页面(ASP,PHP,JAVA,CGI)进 行测试的能力。还有就是他支持原创 2016-01-05 12:58:53 · 1968 阅读 · 2 评论 -
Lighttpd1.4.20源码分析 笔记 状态机之错误处理和连接关闭
这里所说的错误有两种: 1.http协议规定的错误,如404错误; 2.服务器运行过程中的错误,如write错误。对于http协议规定的错误,这里的“错误”是针对客户端的。lighttpd返回相应的错误提示文件之后,相当于顺利的完成了一次请求,只是结果和客户端想要的不一样而已。对于服务器运行中的错误,状态机进入CON_STATE_ERROR状态。常见的错误原因:客户端提前断开连接。比如你不停的刷原创 2016-01-22 11:17:48 · 2480 阅读 · 0 评论 -
《UNIX网络编程》 第三章 套接字编程简介
一.套接字地址结构IPv4的地址结构为sockaddr_in,IPv6为sockaddr_in6,链路协议sockaddr_dl,Unix域为sockaddr_un,存储为sockaddr_storage。**套接字地址结构总是以引用形式来传递!1.IPv4struct in_addr{in_addr_t s_addr; // 32比特的IPv4地址,网络字节序// 需要函数将点分十进制的地址转化为原创 2015-12-22 21:11:06 · 674 阅读 · 0 评论 -
【网络编程】epoll简介
参考资料:百度百科 http://baike.baidu.com/link?url=eILEoEbco16wdGHjZuonmRp9KBjxqRL3jlgQFWevm1ldGGqc2565L5sAWTfz8onretDqWSYjzOB1bAuD-I6tna江南烟雨 http://blog.csdn.net/xiajun07061225/article/details/9250579《深入理解ng原创 2016-01-04 11:00:36 · 1801 阅读 · 0 评论 -
【slighttpd】基于lighttpd架构的Server项目实战(5)—TCP的TIME_WAIT状态
上一节我们已经开发了一个简单的echo服务器,在这里我们先不急着继续下去,先看看一些小细节!在listener的代码中,对于监听套接字,我设置了SO_REUSEADDR这个选项,那么,这个选项有什么用呢?int reuse = 1;setsockopt(listen_sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));要明白这个问题,我原创 2016-02-05 12:37:24 · 1262 阅读 · 0 评论 -
【slighttpd】基于lighttpd架构的Server项目实战(6)—预备知识之Http
接下来,我们开始http部分的开发。在此之前,有必要先学习一下HTTP协议~http1.1 的rfc文档:http://www.ietf.org/rfc/rfc2616.txt简介超文本传输协议(Hypertext Transfer Protocol,简称HTTP)是应用层协议,是一种请求/响应式的协议,即一个客户端与服务器建立连接后,向服务器发送一个请求,服务器接到请求后,给予相应的响应信息。HT原创 2016-02-05 17:10:00 · 3086 阅读 · 0 评论 -
《Linux多线程服务端编程》—muduo网络库(1)
TCP网络编程本质论思维转换:把原来“主动调用recv(2)来接收数据,主动调用accept(2)来接受新连接,主动调用send(2)来发送数据”的思路转换为“注册一个收数据的回调,网络库收到数据会调用我,直接把数据提供给我,供我消费。注册一个接受连接的回调,网络库接受了新连接会回调我,直接把新连接对象传给我,供我使用。需要发送数据的时候,只管往连接中写,网络库会负责无阻塞地发送。”作者(陈硕)认为原创 2016-09-07 23:39:22 · 2801 阅读 · 0 评论