<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[啦啦啦]]></title><description><![CDATA[取法其上，得乎其中，取法其中，得乎其下，取法其下，法不得也]]></description><link>https://blog.youkuaiyun.com/Function_Dou</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Function_Dou]]></copyright><item><title><![CDATA[新博客地址]]></title><link>https://blog.youkuaiyun.com/Function_Dou/article/details/91354376</link><guid>https://blog.youkuaiyun.com/Function_Dou/article/details/91354376</guid><author>Function_Dou</author><pubDate>Sun, 09 Jun 2019 16:41:11 +0800</pubDate><description><![CDATA[现在新的博客地址 www.rpz105.com

]]></description><category></category></item><item><title><![CDATA[0. 网络编程目录]]></title><link>https://blog.youkuaiyun.com/Function_Dou/article/details/90261133</link><guid>https://blog.youkuaiyun.com/Function_Dou/article/details/90261133</guid><author>Function_Dou</author><pubDate>Thu, 16 May 2019 12:23:32 +0800</pubDate><description><![CDATA[至今已经在第二次写网络编程的博客了, 去年将网络分析和系统编程一起进行整理的, 而且没有对每一个知识点进行归纳和总结. 前段时间还是又回顾了TCP编程的一点基础, 为了以后回顾还有学习网络编程的看到写的博客后能够成系列的来学习, 还是决定还是重新整理一下更好.
现在模块分为四个部分 : TCP通信, TCP协议(计算机网络的部分知识), UDP通信, HTTP 通信.
整个板块的目的就在于如何实...]]></description><category></category></item><item><title><![CDATA[gdb 多线程和多进程调试]]></title><link>https://blog.youkuaiyun.com/Function_Dou/article/details/90070226</link><guid>https://blog.youkuaiyun.com/Function_Dou/article/details/90070226</guid><author>Function_Dou</author><pubDate>Fri, 10 May 2019 15:49:18 +0800</pubDate><description><![CDATA[gdb 多进程和多线程调试

多进程调试



info inferiors : 显示当前的多进程信息. 前面有 * 表示当前调试的进程






inferiors num : 指定当前调试的进程.  num表示当前跳转到调试的进程番号.
如果要调试子进程的话, 可以用 ps 命令查看在使用该命令执行指定进程的调试






set|show follow-fork-mode


show ...]]></description><category></category></item><item><title><![CDATA[53. 线程池]]></title><link>https://blog.youkuaiyun.com/Function_Dou/article/details/90065894</link><guid>https://blog.youkuaiyun.com/Function_Dou/article/details/90065894</guid><author>Function_Dou</author><pubDate>Fri, 10 May 2019 15:19:54 +0800</pubDate><description><![CDATA[一般在web服务端使用线程池是比较常见的, 本节呢, 就已以实现一个简单的web服务端为目标, 仅仅实现GET请求, 最多在加上POST请求.
如果对web服务端并不熟悉的, 可以回过头去看一下http请求与应答以及一个500行左右的web服务端源码tinyhttpd(整理了源码以及修改和加注释后的linux版本).

线程池主要函数
线程池完整代码位置 : threadpool

因为线程池的...]]></description><category></category></item><item><title><![CDATA[52. 线程-IO复用(EPOLLONESHOT)]]></title><link>https://blog.youkuaiyun.com/Function_Dou/article/details/90065602</link><guid>https://blog.youkuaiyun.com/Function_Dou/article/details/90065602</guid><author>Function_Dou</author><pubDate>Fri, 10 May 2019 15:17:54 +0800</pubDate><description><![CDATA[线程怎么与IO复用联系起来,  IO复用中创建线程? 还是线程中IO复用?  这个问题用在进程也是一样的. 其实两种方式都可以. 本节采用在 IO复用中创建线程, 接下来就来看看具体怎么实现的吧.

epoll 的EPOLLONESHOT事件
还记得 epoll 的 event 可设置的状态吗? 忘了也不急, 这里将 IO复用之epoll函数 的状态粘贴过来.




event值
描述



...]]></description><category></category></item><item><title><![CDATA[51. 线程-服务端]]></title><link>https://blog.youkuaiyun.com/Function_Dou/article/details/90065158</link><guid>https://blog.youkuaiyun.com/Function_Dou/article/details/90065158</guid><author>Function_Dou</author><pubDate>Fri, 10 May 2019 15:14:41 +0800</pubDate><description><![CDATA[在最开始实现并发服务端的时候, 最开始想到的办法便是使用多进程, 使每个 TCP 连接对应一个进程; 之后我们又将多进程并发改写成了 IO 复用的方式实现了相同的功能; 但现在唯一没有将服务端改写成线程, 本节就来改写服务端.

线程服务端
在改写成多线程之前, 要对 [线程创建], [线程同步]以及线程终止有所了解才行.

主函数仅仅只是将连接后回射操作交给线程即可 :
int main(in...]]></description><category></category></item><item><title><![CDATA[50. 进程池]]></title><link>https://blog.youkuaiyun.com/Function_Dou/article/details/90064885</link><guid>https://blog.youkuaiyun.com/Function_Dou/article/details/90064885</guid><author>Function_Dou</author><pubDate>Fri, 10 May 2019 15:12:31 +0800</pubDate><description><![CDATA[一般进程池和线程池都是并发编程中常见的, 如nginx采用进程池, 也有实现协程降低上下文切换的代价等等,    使用和实现这些方法都是为了提高我们服务端的并发能力.
进程池和线程池都是避免服务端频繁的创建进程(线程), 毕竟创建进程(线程)的代价很大. 所以可先在程序运行时便分配出一定的进程(线程)数, 如果有事件就绪便可以直接调用分配好的进程, 让进程池中的进程区处理事件, 事件处理结束后进...]]></description><category></category></item><item><title><![CDATA[49. HTTP 请求/应答]]></title><link>https://blog.youkuaiyun.com/Function_Dou/article/details/90064608</link><guid>https://blog.youkuaiyun.com/Function_Dou/article/details/90064608</guid><author>Function_Dou</author><pubDate>Fri, 10 May 2019 15:10:16 +0800</pubDate><description><![CDATA[HTTP 协议是 Hyper Text Transfer Protocol (超文本传输协议) 缩写, 并且是基于 TCP/IP 通信协议来传递数据.

HTTP 协议特点

无连接 : 每次进行一次 HTTP 通信. 服务器处理完客户的请求并收到客户的应答后立即断开连接, 这种方式被称为短连接. 采用这种方式可以节省传输时间, 但是连续传输使用短连接就比较消耗资源.  (http1.1后有长连...]]></description><category></category></item><item><title><![CDATA[48. 半同步/半异步]]></title><link>https://blog.youkuaiyun.com/Function_Dou/article/details/90064442</link><guid>https://blog.youkuaiyun.com/Function_Dou/article/details/90064442</guid><author>Function_Dou</author><pubDate>Fri, 10 May 2019 15:08:57 +0800</pubDate><description><![CDATA[本节说到的半同步与半异步跟同步和异步并不是一个概念, 请不要混淆了. 也为了避免混淆, 下面也会对同步和异步做一个简要的说明.

同步/异步
同步和异步是属于IO模型中, 前面已经对IO模型有过接触了( 如 非阻塞IO[1]).

同步 : 内核通知进程有数据到来, 进程从内核空间中将数据复制到应用空间中.
异步 : 内核将数据复制到指定的空间中后通知进程, 进程只管处理数据. 异步不会阻塞.
...]]></description><category></category></item><item><title><![CDATA[47. web 客户程序]]></title><link>https://blog.youkuaiyun.com/Function_Dou/article/details/90064252</link><guid>https://blog.youkuaiyun.com/Function_Dou/article/details/90064252</guid><author>Function_Dou</author><pubDate>Fri, 10 May 2019 15:07:27 +0800</pubDate><description><![CDATA[前面铺垫了非阻塞 connect 以及 HTTP 请求, 本节就已 unp 书上的例子实现一个简单的 web 客户端程序.

客户程序
使用非阻塞式connect 保证同时能建立多个 TCP 连接.
如果使用阻塞式 connect, 每次都必须等待上一个连接成功后才能建立下一个连接; 而我们所写的客户程序只是将第一个连接单独执行, 之后的多个连接再并行连接.

完整代码 : client_web...]]></description><category></category></item><item><title><![CDATA[46. 域名解析]]></title><link>https://blog.youkuaiyun.com/Function_Dou/article/details/90063956</link><guid>https://blog.youkuaiyun.com/Function_Dou/article/details/90063956</guid><author>Function_Dou</author><pubDate>Fri, 10 May 2019 15:05:10 +0800</pubDate><description><![CDATA[前面我们使用的所有客户端建立连接都是在知道对方的 IP 地址基础上进行的. 但是如果我们需要使用前面的客户端程序与网页建立连接难不成还要记住该网页的 IP 不成?
当然. 有过网络基础上肯定知道 DNS域名服务器. 该类域名系统通过主机名就可以查询得到其 IP 地址, 之后便顺利进行连接. 当然操作系统也为我们提供这类系统函数, 保证我们只需要通过主机名就能与网页发起连接.

gethostna...]]></description><category></category></item><item><title><![CDATA[45. connect 实现定时]]></title><link>https://blog.youkuaiyun.com/Function_Dou/article/details/89959563</link><guid>https://blog.youkuaiyun.com/Function_Dou/article/details/89959563</guid><author>Function_Dou</author><pubDate>Wed, 08 May 2019 16:26:29 +0800</pubDate><description><![CDATA[我们需要先连接 getaddrinfo, 而 getaddrinfo 的特性实在太多, 本节也仅仅只是简单的做一个小结, 如果想要了解更加全面可以参考 unp 第245页.

getaddrinfo 函数
getaddrinfo 函数是与协议无关 (TCP, UDP都可以) 并且不仅支持 IPV4 还支持 IPV6 .
函数原型 :
#include &lt;netdb.h&gt;

int g...]]></description><category></category></item><item><title><![CDATA[44. 最大保持TCP连接个数]]></title><link>https://blog.youkuaiyun.com/Function_Dou/article/details/89959444</link><guid>https://blog.youkuaiyun.com/Function_Dou/article/details/89959444</guid><author>Function_Dou</author><pubDate>Wed, 08 May 2019 16:23:56 +0800</pubDate><description><![CDATA[前面通过IO复用实现了 connect 的定时, 本节使用 connect 非阻塞验证进程 能保持多少 TCP连接.

非阻塞式
非阻塞 connect 还能用来测试服务端的抗压能力, 当然使用阻塞 connect 也能够保持多个 TCP 连接, 但效率没有非阻塞高. 可以看出来同一时间阻塞式的必须保证一个连接成功才会执行后一个连接, 非阻塞式能够在同一时间保证多个连接的进行.

完整代码 : ...]]></description><category></category></item><item><title><![CDATA[43. TCP套接字之connect非阻塞]]></title><link>https://blog.youkuaiyun.com/Function_Dou/article/details/89959332</link><guid>https://blog.youkuaiyun.com/Function_Dou/article/details/89959332</guid><author>Function_Dou</author><pubDate>Wed, 08 May 2019 16:21:32 +0800</pubDate><description><![CDATA[本节来将客户端的connect阻塞式改为非阻塞式. 这样可以同时向服务端发起多个连接并一起进行处理, 非阻塞connect一般用来测试服务端的抗压能力.

connect 非阻塞用途
connect设置为非阻塞之后会立即返回 设置errno为 EINPROGRESS 错误, 表示连接操作正在进行中, 但是仍未完成连接; 同时TCP的三次握手操作继续进行.  之后, 可以调用 select 来检查...]]></description><category></category></item><item><title><![CDATA[42. TCP套接字之accept非阻塞]]></title><link>https://blog.youkuaiyun.com/Function_Dou/article/details/89959249</link><guid>https://blog.youkuaiyun.com/Function_Dou/article/details/89959249</guid><author>Function_Dou</author><pubDate>Wed, 08 May 2019 16:20:14 +0800</pubDate><description><![CDATA[本节来理论性的了解一下关于服务端 accept 非阻塞.

阻塞 accept
服务器在繁忙过程时, 在建立三次握手之后, 调用accept之前,  如果出现客户端突然断开连接的情况, POSIX 指出这种情况 errno 设置为 CONNABORTED.
如: 三次握手之后, 客户端发送 RST后断开连接, 之后服务端调用accept准备执行连接但并不知道对端已经关闭, 这个时候accept就...]]></description><category></category></item><item><title><![CDATA[41. 非阻塞IO]]></title><link>https://blog.youkuaiyun.com/Function_Dou/article/details/89959151</link><guid>https://blog.youkuaiyun.com/Function_Dou/article/details/89959151</guid><author>Function_Dou</author><pubDate>Wed, 08 May 2019 16:18:21 +0800</pubDate><description><![CDATA[前面我们所使用的IO都是阻塞式的, 当然, 默认也是阻塞式的. 不过我们也可以设置文件描述符将阻塞式变为非阻塞式. 我们为什么会将阻塞式转为非阻塞式呢? 肯定是有好处的, 而本节就先简单介绍一下关于非阻塞式.

阻塞式
先来了解一下阻塞式.
阻塞式 : 进程运行到阻塞式的函数时会被投入睡眠切换执行其他程序, 直到被中断或者被唤醒才会切换回程序继续执行.
阻塞式的问题 :

对于CPU来说IO操作...]]></description><category></category></item><item><title><![CDATA[40. socket 就绪条件]]></title><link>https://blog.youkuaiyun.com/Function_Dou/article/details/89949820</link><guid>https://blog.youkuaiyun.com/Function_Dou/article/details/89949820</guid><author>Function_Dou</author><pubDate>Wed, 08 May 2019 13:04:59 +0800</pubDate><description><![CDATA[在实现网络通信前, 先来了解一下socket套接字什么时候就绪(可读可写). 第一次学习socket只需要明白我用红色标记的条件就行.

缓冲区
每个套接字接收区缓存 (用于读) 和发送区缓存 (用于写)  :

接收区缓存: 接收数据, 从内核缓冲复制到用户应用程序数据缓冲区.
发送去缓存: 用户应用程序数据缓冲区复制到内核缓冲区, 等待发送.

每个套接字都有接收缓存区低水位标记(用于读)和...]]></description><category></category></item><item><title><![CDATA[39. TCP套接字之日志记录]]></title><link>https://blog.youkuaiyun.com/Function_Dou/article/details/89949753</link><guid>https://blog.youkuaiyun.com/Function_Dou/article/details/89949753</guid><author>Function_Dou</author><pubDate>Wed, 08 May 2019 12:57:20 +0800</pubDate><description><![CDATA[前面我们实现了完整的TCP通信, 现在我们可以来考虑为通信加上日志记录的功能. 实现日志记录可以直接将数据写入文件中.

管道实现日志记录
这里采用管道实现进程间通信, 通过一个单独的进程来记录日志.
主要用到的就是文件的创建, 无名管道以及进程间通信的方法.

以下是删除了大部分的服务端代码, 只留下了修改过后的代码. 这里采用的是带缓冲的fwrite函数实现向文件里写入数据. 因为采用的fw...]]></description><category></category></item><item><title><![CDATA[38. TCP套接字之标准IO]]></title><link>https://blog.youkuaiyun.com/Function_Dou/article/details/89949729</link><guid>https://blog.youkuaiyun.com/Function_Dou/article/details/89949729</guid><author>Function_Dou</author><pubDate>Wed, 08 May 2019 12:54:46 +0800</pubDate><description><![CDATA[上节实验了关于标准IO能够明显提升运行效率, 那么本节就来将之前使用的系统IO改为标准IO试试.

修改为标准IO
本节修改的代码是epoll中修改后的代码. 其实就只需要把客服端的read函数换成标准IO的fgets即可.
while(1){
	testrfds = rfds;
	select(sockfd + 1, &amp;testrfds, NULL, NULL, NULL);
	if(...]]></description><category></category></item><item><title><![CDATA[37. 标准IO]]></title><link>https://blog.youkuaiyun.com/Function_Dou/article/details/89949697</link><guid>https://blog.youkuaiyun.com/Function_Dou/article/details/89949697</guid><author>Function_Dou</author><pubDate>Wed, 08 May 2019 12:51:40 +0800</pubDate><description><![CDATA[前面我们使用所有的输入输出都是无缓冲的系统IO, 那么能不能用标准IO来代替系统IO呢?
可能有人回想问为什么要代替系统IO呢? 先来看一个例子就知道原因了.

复制文件
这里我使用系统IO和标准IO来复制一个比较大的文件来说明原因. 这里实验的文件大小是200M左右

系统IO :
完整代码 : stdcpy.c
#include &lt;stdio.h&gt;
#include &lt;un...]]></description><category></category></item></channel></rss>