![](https://img-blog.csdnimg.cn/82bcecc96b324396af31ff8fcbc64d27.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
网络编程实战
文章平均质量分 91
网络编程实战-jksj
liufeng2023
日拱一卒
展开
-
76-poll:另一种I/O多路复用
select 方法是多个 UNIX 平台支持的非常常见的 I/O 多路复用技术,它通过描述符集合来表示检测的 I/O 对象;通过三个不同的描述符集合来描述 I/O 事件 :可读、可写和异常。但是 select 有一个缺点,那就是所支持的文件描述符的个数是有限的。在 Linux 系统中,select 的默认最大值为 1024。那么有没有别的 I/O 多路复用技术可以突破文件描述符个数限制呢?当然有,这就是 poll 函数。这一讲,我们就来学习一下另一种 I/O 多路复用的技术:poll。...原创 2022-04-25 20:09:36 · 291 阅读 · 0 评论 -
22-大名⿍⿍的select:看我如何同时感知多个I/O事件
开篇词这一讲是性能篇的第一讲。在性能篇里,我们将把注意力放到如何设计高并发高性能的网络服务器程序上。我希望通过这一模块的学习,让你能够掌握多路复用、异步 I/O、多线程等知识,从而可以写出支持并发 10K 以上的高性能网络服务器程序。1、什么是 I/O 多路复用在第 11 讲中,我们设计了这样一个应用程序,该程序从标准输入接收数据输入,然后通过套接字发送出去,同时,该程序也通过套接字接收对方发送的数据流。我们可以使用 fgets 方法等待标准输入,但是一旦这样做,就没有办法在套接字有数据的原创 2022-04-24 21:37:14 · 208 阅读 · 0 评论 -
21-期中大作业
期中大作业—动手编写一个自己的程序吧!开篇词客户端程序:主要考察使用 select 多路复用,一方面从标准输入接收字节流,另一方面通过套接字读写,以及使用 shutdown 关闭半连接的能力。服务器端程序:考察套接字读写的能力,以及对端连接关闭情况下的异常处理等能力。题干请你分别写一个客户端程序和服务器程序,客户端程序连接上服务器之后,通过敲命令和服务器进行交互,支持的交互命令包括:pwd:显示服务器应用程序启动时的当前路径。cd:改变服务器应用程序的当前路径。ls:显示服务器应用程原创 2022-04-24 21:35:41 · 147 阅读 · 0 评论 -
52-提高篇答疑:如何理解TCP四次挥手?
1、提高篇答疑:如何理解TCP四次挥手?1.1、如何理解 TCP 四次挥手?TCP 建立一个连接需 3 次握手,而终止一个连接则需要四次挥手。四次挥手的整个过程是这样的:首先,一方应用程序调用 close,我们称该方为主动关闭方,该端的 TCP 发送一个 FIN 包,表示需要关闭连接。之后主动关闭方进入 FIN_WAIT_1 状态。接着,接收到这个 FIN 包的对端执行被动关闭。这个 FIN 由 TCP 协议栈处理,我们知道,TCP 协议栈为 FIN 包插入一个文件结束符 EOF 到接收缓冲区原创 2022-04-23 10:47:17 · 217 阅读 · 0 评论 -
51-防人之心不可无:检查数据的有效性
1、防人之心不可无:检查数据的有效性开篇词为了增强程序的健壮性,我们还需要准备什么。1.1、对端的异常状况在前面的第 11 讲以及第 17 讲中,我们已经初步接触过一些防范对端异常的方法;比如,通过 read 等调用时,可以通过对 EOF 的判断,随时防范对方程序崩溃。int nBytes = recv(connfd, buffer, sizeof(buffer), 0);if (nBytes == -1) { error(1, errno, "error read message")原创 2022-04-23 10:45:40 · 144 阅读 · 0 评论 -
50-TCP并不总是“可靠”的?
1、TCP并不总是“可靠”的?开篇词前面一讲中,我们讲到如何理解 TCP 数据流的本质,进而引出了报文格式和解析。这一讲,通过如何增强读写操作,以处理各种“不可靠”的场景。1.1、TCP 是可靠的?你可能会认为,TCP 是一种可靠的协议,这种可靠体现在端到端的通信上。从发送端来看,应用程序通过调用 send 函数发送的数据流总能可靠地到达接收端;而从接收端来看,总是可以把对端发送的数据流完整无损地传递给应用程序来处理。事实上, 如果我们对 TCP 传输环节进行详细的分析,你就会沮丧地发现原创 2022-04-23 10:41:17 · 1528 阅读 · 0 评论 -
47-如何理解TCP的“流”?
1、如何理解TCP的“流”?前面讲了,使用 SO_REUSEADDR 套接字选项,可以让服务器满足快速重启的需求。这一讲里,我们回到数据的收发这个主题,谈一谈如何理解 TCP 的数据流特性。1.1、TCP 是一种流式协议在前面的章节中,我们讲的都是单个客户端 - 服务器的例子,可能会给你造成一种错觉,好像 TCP 是一种应答形式的数据传输过程;比如发送端一次发送 network 和 program 这样的报文,在前面的例子中,我们看到的结果基本是这样的:发送端:network ---->原创 2022-04-22 22:53:09 · 671 阅读 · 0 评论 -
46- 怎么老是出现“地址已经被使用”?
1、 怎么老是出现“地址已经被使用”?开篇词上一讲我们讲到 UDP 也可以像 TCP 一样,使用 connect 方法,以快速获取异步错误的信息。今天将讨论 服务器端程序重启时,地址被占用的原因和解决方法。网络编程中,服务器程序需要绑定本地地址和一个端口,然后就监听在这个地址和端口上,等待客户端连接的到来。在实战中,你可能会经常碰到一个问题,当服务器端程序重启之后,总是碰到“Address in use”的报错信息,服务器程序不能很快地重启。那么这个问题是如何产生的?我们又该如何避免呢?今天我原创 2022-04-22 22:48:59 · 6187 阅读 · 0 评论 -
45-UDP也可以是“已连接”?
1、UDP也可以是“已连接”?开篇词前面讲到:“UDP 等于无连接协议”的特性为什么,题目是UDP也可以是“已连接”?1.1、从一个例子开始先从一个客户端例子开始,在这个例子中:客户端在 UDP 套接字上调用 connect 函数,之后将标准输入的字符串发送到服务器端,并从服务器端接收处理后的报文。当然,向服务器端发送和接收报文是通过调用函数 sendto 和 recvfrom 来完成的。#include "lib/common.h"# define MAXLINE 4096原创 2022-04-22 22:46:36 · 400 阅读 · 0 评论 -
44-小数据包应对之策:理解TCP协议中的动态数据传输
1、小数据包应对之策:理解TCP协议中的动态数据传输开篇词在上一篇文章里,在应用程序中模拟了 TCP Keep-Alive 机制,完成 TCP 心跳检测,达到发现不活跃连接的目的。在这一讲里,我们将从 TCP 角度看待数据流的发送和接收。如果你学过计算机网络的话,那么对于发送窗口、接收窗口、拥塞窗口等名词肯定不会陌生,它们各自解决的是什么问题,又是如何解决的?在今天的文章里,我希望能从一个更加通俗易懂的角度进行剖析。1.1、调用数据发送接口以后……通过套接字发送数据,比如使用 write 或者原创 2022-04-22 22:44:25 · 173 阅读 · 0 评论 -
42-连接无效:使用Keep-Alive还是应用心跳来检
1、连接无效:使用Keep-Alive还是应用心跳来检测? 前面讲到了如何使用 close 和 shutdown 来完成连接的关闭,在大多数情况下,我们会优选 shutdown 来完成对连接一个方向的关闭,待对端处理完之后,再完成另外一个方向的关闭。在很多情况下,连接的一端需要一直感知连接的状态,如果连接无效了,应用程序可能需要报错,或者重新发起连接等。这一讲,体验一下对连接状态的检测,并提供检测连接状态的最佳实践。1.1、从一个例子开始我之前做过一个基于 NATS 消息系统的项目,多个消息原创 2022-04-22 13:28:10 · 263 阅读 · 0 评论 -
41-优雅地关闭还是粗暴地关闭 ?
1、优雅地关闭还是粗暴地关闭 ?1.1、半关闭状态TCP 的四次挥手,其中发起连接关闭的一方会有一段时间处于 TIME_WAIT 状态。那么究竟如何来发起连接关闭呢? 一个 TCP 连接需要经过三次握手进入数据传输阶段,最后来到连接关闭阶段。在最后的连接关闭阶段,我们需要重点关注的是 “半连接”状态。因为 TCP 是双向的,这里说的方向,指的是数据流的写入 - 读出的方向。 比如客户端到服务器端的方向,指的是客户端通过套接字接口,向服务器端发送 TCP 报文;而服务器端到客户端方向则是另一个传原创 2022-04-22 13:23:41 · 2645 阅读 · 0 评论 -
38-TIME_WAIT:隐藏在细节下的魔鬼
10、TIME_WAIT:隐藏在细节下的魔鬼开篇词前面的基础篇里,我们对网络编程涉及到的基础知识进行了梳理,主要内容包括 C/S 编程模型、TCP 协议、UDP 协议和本地套接字等内容。在提高篇里,我将结合我的经验,引导你对 TCP 和 UDP 进行更深入的理解。学习完提高篇之后,我希望你对如何提高 TCP 及 UDP 程序的健壮性有一个全面清晰的认识,从而为深入理解性能篇打下良好的基础。问题:前面基础篇中,了解了 TCP 四次挥手,在四次挥手的过程中,发起连接断开的一方会有一段时间处于 T原创 2022-04-22 08:58:51 · 113 阅读 · 0 评论 -
37-工欲善其事必先利其器:学会使用各种工具
1、 工欲善其事必先利其器:学会使用各种工具Linux 平台下提供的各种网络工具,则为我们进行诊断分析提供了很好的帮助。在这一讲里,我将会选择几个重点的工具逐一介绍。1.1、必备工具: ping“ping”: 这个命名来自于声呐探测,在网络上用来完成对网络连通性的探测;$ ping www.sina.com.cnPING www.sina.com.cn (202.102.94.124) 56(84) bytes of data.64 bytes from www.sina.com.cn (202原创 2022-04-21 21:28:47 · 576 阅读 · 0 评论 -
36-What? 还有本地套接字?
1、What? 还有本地套接字?本地套接字是 IPC,也就是本地进程间通信的一种实现方式。除了本地套接字以外,其它技术,诸如管道、共享消息队列等也是进程间通信的常用方法;但因为本地套接字开发便捷,接受度高,所以普遍适用于在同一台主机上进程间通信的各种场景。下面学习本地套接字方面的知识,并且利用本地套接字完成可靠字节流和数据报两种协议。1.1、本地套接字概述本地套接字一般也叫做 UNIX 域套接字,最新的规范已经改叫本地套接字。本地套接字是一种特殊类型的套接字,和 TCP/UDP 套接字不同。原创 2022-04-21 21:26:25 · 128 阅读 · 0 评论 -
35-嗨,别忘了UDP这个小兄弟
1、嗨,别忘了UDP这个小兄弟讲讲 UDP 方面的编程知识。UDP 是一种“数据报”协议,而 TCP 是一种面向连接的“数据流”协议。TCP 类似打电话;在这个例子中,拨打号码、接通电话、开始交流,分别对应了 TCP 的三次握手和报文传送。一旦双方的连接建立,那么双方对话时,一定知道彼此是谁。这个时候我们就说,这种对话是有上下文的。UDP类似寄明信片:在这个例子中,发信方在明信片中填上了接收方的地址和邮编,投递到邮局的邮筒之后,就可以不管了;发信方也可以给这个接收方再邮寄第二张、第三张原创 2022-04-21 21:22:23 · 133 阅读 · 0 评论 -
25-使用套接字进行读写:开始交流吧
1、使用套接字进行读写:开始交流吧这节主要讲 如何使用创建的套接字收发数据。1.1、发送数据发送数据时常用的有三个函数,分别是 write、send 和 sendmsg。ssize_t write (int socketfd, const void *buffer, size_t size)ssize_t send (int socketfd, const void *buffer, size_t size, int flags)ssize_t sendmsg(int sockfd, const原创 2022-04-20 14:00:49 · 178 阅读 · 0 评论 -
24-TCP三次握手:怎么使用套接字格式建立连接?
1、TCP三次握手:怎么使用套接字格式建立连接?上一讲介绍了 IPv4、IPv6 以及本地套接字格式;这一讲我们来讲一讲怎么使用这些套接字格式完成连接的建立,当然,经典的 TCP 三次握手理论也会贯穿其中。希望经过这一讲的讲解,你会牢牢记住 TCP 三次握手和客户端、服务器模型。1.1、服务端准备连接的过程1.1.1、创建套接字创建套接字函数:int socket(int domain, int type, int protocol) domain 就是指 PF_INET、PF_IN原创 2022-04-20 13:56:37 · 1150 阅读 · 0 评论 -
23-套接字和地址:像电话和电话号码一样理解它们
1、套接字和地址:像电话和电话号码一样理解它们在网络编程中,我们经常会提到 socket 这个词,中文翻译为套接字。1.1、socket 到底是什么?这张图表达的其实是网络编程中,客户端和服务器工作的核心逻辑。先从右侧的服务器端开始看:(因为在客户端发起连接请求之前,服务器端必须初始化好。)右侧的图显示的是服务器端初始化的过程;首先初始化 socket;之后服务器端需要执行 bind 函数,将自己的服务能力绑定在一个众所周知的地址和端口上;服务器端执行 listen 操作,将原先的 so原创 2022-04-20 13:52:48 · 1254 阅读 · 0 评论 -
2-网络编程模型:认识客户端-服务器网络模型的基本概念
1、网络编程模型:认识客户端-服务器网络模型的基本概念1.1、OSI模型和TCP/IP协议栈1.2、客户端 - 服务器网络编程模型网络购物来说,我们在手机上的每次操作,都是作为客户端向服务器发送请求,并收到响应的例子。过程:当一个客户端需要服务时,比如网络购物下单,它会向服务器端发送一个请求。 注意,这个请求是按照双方约定的格式来发送的,以便保证服务器端是可以理解的;服务器端收到这个请求后,会根据双方约定的格式解释它,并且以合适的方式进行操作,比如调用数据库操作来创建一个购物单;服务器端原创 2022-04-18 21:53:42 · 1159 阅读 · 0 评论 -
1-开篇词—学好网络编程,需要掌握哪些核心问题?
1、开篇词—学好网络编程,需要掌握哪些核心问题?问你一些关于网络编程方面的问题,你会怎样回答呢?大家经常说的四层、七层,分别指的是什么?TCP 三次握手是什么,TIME_WAIT 是怎么发生的?CLOSE_WAIT 又是什么状态?Linux 下的 epoll 解决的是什么问题?如何使用 epoll 写出高性能的网络程序?什么是网络事件驱动模型?Reactor 模式又是什么?学习高性能网络编程,掌握两个核心要点:理解网络协议,并在这个基础上和操作系统内核配合,感知各种网络 I/O 事件;原创 2022-04-18 21:45:25 · 373 阅读 · 0 评论