网络编程实战
文章平均质量分 52
极客时间之网络编程实战
zhaoseaside
树立个人IP,探索副业可能
展开
-
简单的HTTP服务器端代码
我这篇文章代码来自尹圣雨著《TCP/IP网络编程》第24章。原创 2024-01-14 23:28:15 · 962 阅读 · 0 评论 -
TCP或许不是“可靠”的
从接收端这方面来说,也没有ACK 过的数据部分一定被应用程序处理的保证,因为数据需要接收端程序从接收缓冲区中拷贝到应用缓冲区,可能出现的状况是,已经 ACK 的数据存储在接收端缓冲区中,接收端处理程序突然崩溃了,这部分数据就没有办法被应用程序继续处理。,存储在发送端发送缓冲区的对应数据就可以删除了,但是,发送端并无法获取对应数据流的 ACK 情况,也就是说,发送端无办法判断对端的接收方是否已经接收发送的数据流,如果需要知道这部分信息,就应该由开发者自己在应用层添加处理逻辑,比如显式的报文确认机制。原创 2023-12-17 23:19:29 · 232 阅读 · 0 评论 -
TCP显式编码报文长度发送与接收
【代码】TCP显式编码报文长度发送与接收。原创 2023-12-02 23:22:58 · 236 阅读 · 0 评论 -
网络字节序
大端字节序和小端字节序原创 2023-11-30 16:59:01 · 74 阅读 · 0 评论 -
TCP数据流的概念
考虑到实际网络中的各种影响,那么其实发送端调用send函数发送两个字符串和welcome的实际TCP分组可能有很多种。原创 2023-11-29 21:21:41 · 957 阅读 · 2 评论 -
TIME_WAIT状态套接字重新使用
SO_REUSEADDR用来告诉操作系统内核,如果端口已被占用,但是 TCP 连接状态位于 TIME_WAIT ,可以重用端口。2.开启tcp_timestamps,这样就让新连接时间戳比旧连接时间戳大,这样可以通过检查时间戳来判断新老连接。1.新连接的SYN告知序列号比原来TIME_WAIT老连接末序列号要大,所以就可以通过序列号分辨出来新老连接。在这样两重优化下,重用TIME_WAIT状态连接就不会产生任何问题了。之后按下回车键,还是需要在服务器端快速按下。启动程序,然后快速在客户端使用。原创 2023-11-27 20:23:49 · 221 阅读 · 0 评论 -
TIME_WAIT状态TCP连接导致套接字无法重用实验
此文章为11月Day 25学习笔记,内容来源于极客时间。原创 2023-11-25 23:48:20 · 151 阅读 · 0 评论 -
UDP客户端使用connect与UDP服务器使用send函数和recv函数收发数据
服务器4096进行编译,运行。原创 2023-11-23 23:38:38 · 856 阅读 · 0 评论 -
UDP中connect的作用
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen)在udp中作用原创 2023-11-22 23:42:23 · 745 阅读 · 0 评论 -
UDP接收报文函数recvfrom和UDP发送报文函数sendto
后面两个参数 from 和 addrlen,实际上是返回对端发送方的地址和端口等信息,这和 TCP 非常不一样,TCP 是通过 accept 函数拿到的描述字信息来决定对端的信息。sockfd 是本地创建的套接字描述符,buff 指向发送的缓存,nbytes 表示发送字节数。sockfd 是本地创建的套接字描述符,buff 指向本地的缓存,nbytes 表示最大接收数据字节。第四个参数 flags 是和 I/O 相关的参数,这里我们还用不到,设置为 0。函数的返回值告诉我们实际发送的字节数。原创 2023-11-21 23:17:38 · 1001 阅读 · 0 评论 -
使用writev将多个小数据包合并发送,使用sysconf(_SC_IOV_MAX)查看writev函数最多允许数组大小
显示出来的结果就是writev 函数一次性最多允许数组的大小。此文章为11月Day 20学习笔记,内容来源于极客时间。运行程序,然后输入想要发送的字符串之后,按下回车键。加上你输入的字符串,比如你要是输入了。这段代码会向服务器端发送。,那么往服务器端发送的是。将代码进行编译,然后。原创 2023-11-20 19:28:14 · 135 阅读 · 0 评论 -
writev函数的使用测试
此文章为11月Day 19学习笔记,内容来源于极客时间。原创 2023-11-19 22:26:53 · 315 阅读 · 0 评论 -
TCP中发送数据的情况
超过这个阈值之后,慢启动就结束了,另一个叫做“拥塞避免”的算法登场。在任何一个时刻,TCP 发送缓冲区的数据是否能真正发送出去,至少取决于两个因素,一个是当前的发送窗口大小,另一个是拥塞窗口大小,而 TCP 协议中总是取两者中最小值作为判断依据。糊涂窗口综合征:应用进程间传送的报文段很小的情况,这种现象产生的原因是发送端应用进程产生数据很慢、或接收端应用进程处理接收缓冲区数据很慢,或二者兼而有之。Nagle算法:限制大批量的小数据包同时发送,为此,它提出,在任何一个时刻,未被确认的小数据包不能超过一个。原创 2023-11-17 23:29:02 · 396 阅读 · 0 评论 -
应用层使用select进行检测连接状态
select+PING-PONG进行应用层连接正常与否测试原创 2023-11-16 22:18:52 · 415 阅读 · 0 评论 -
TCP连接保活机制
而开启客户端到服务器端的检测,就可以在服务器无响应的情况下,重新发起连接。在保活时间内,如果没有任何连接相关的活动,TCP 保活机制会开始作用,每隔一个时间间隔(保活时间间隔),发送一个探测报文,该探测报文包含的数据非常少,如果超过保活探测次数,探测报文都没有得到响应,则认为当前的 TCP 连接已经死亡,系统内核将错误信息通知给上层应用程序。当 TCP 保活的探测报文发送给对端后,对端是可以响应的,但由于没有该连接的有效信息,会产生一个 RST 报文,这样很快就会发现 TCP 连接已经被重置。原创 2023-11-15 19:12:48 · 569 阅读 · 0 评论 -
使用select实现定时任务
可以看到这是一个简单的定时小程序,若是5秒内没有输入字符串,那么就会输出。执行,之后可以看到若是没有输入内容的话,那么就会每隔。两次执行,对应上边的5秒内是否输出字符串的描述。+刚刚输入的字符串输出到屏幕上,之后再输出。进行一下改动,就可以实现定时任务了,秒内输入字符串了,那么就会先把。原创 2023-11-14 17:09:15 · 415 阅读 · 0 评论 -
select在标准输出和套接字上进行监控
此文章为11月Day 11学习笔记,内容来源于极客时间。多路复用,使用键盘在服务器这里输入。字符串,可以看到服务器输出了。之后,可以看到客户端收到的。这条信息,而服务器也收到了。而客户端没有任何输出。原创 2023-11-13 21:42:07 · 125 阅读 · 0 评论 -
优雅关闭TCP的函数shutdown效果展示
shutdown函数能够优雅地关闭套接字,一般就是使用它关闭套接字原创 2023-11-11 16:29:48 · 736 阅读 · 0 评论 -
Ubuntu 22.04源码安装cmake 3.27.7
此文章为11月Day 10学习笔记,内容来源于极客时间。是cmake官网下载的网址。可以下载源码,最后显示。原创 2023-11-10 20:19:32 · 933 阅读 · 0 评论 -
服务器往客户端发送字符串的网络编程
服务器主要就是能够打开命令行提供的网络端口,然后一有客户端连接上,就会向客户端发送。此文章为5月Day 5学习笔记,内容来源于极客时间。下边结合代码,主要讲解TCP连接中。客户端就会连接服务器,然后把。而服务端也退出了程序。端口等待客户端连接。连上服务器发送过来的。原创 2023-11-09 21:08:11 · 435 阅读 · 0 评论 -
TCP关闭的两种方法概述
接下来就分别讲解一下这两个函数。原创 2023-11-08 18:06:18 · 702 阅读 · 0 评论 -
Visual Studio 2017附加依赖项
在读韩国人尹圣雨的《TCP/IP网络编程》,在书中教我如何在Visual Studio 2008中设置附加依赖项,但是我使用的是Visual Studio 2017,所以我写下这篇文章学习如何在Visual Studio 2017附加依赖项。这行最右侧的下三角箭头。填写进去,然后点击确定。原创 2023-11-07 17:40:11 · 686 阅读 · 0 评论 -
TIME_WAIT相关知识
这是TCP四次握手的过程图。TCP 连接终止时,主机 1 先发送 FIN 报文,主机 2 进入 CLOSE_WAIT 状态,并发送一个 ACK 应答,同时,主机 2 通过 read 调用获得 EOF,并将此结果通知应用程序进行主动关闭操作,发送 FIN 报文。主机 1 在接收到 FIN 报文后发送 ACK 应答,此时主机 1 进入 TIME_WAIT 状态。原创 2023-11-02 18:36:08 · 129 阅读 · 0 评论 -
Linux网络发送文件
如果想指定选项,发送带外数据,就需要使用第二个带 flag 的函数。所谓带外数据,是一种基于 TCP 协议的紧急数据,用于客户端 - 服务器在特定场景下的紧急处理。第一个函数是常见的文件写函数,如果把 socketfd 换成文件描述符,就是普通的文件写入。如果想指定多重缓冲区传输数据,就需要使用第三个函数,以结构体 msghdr 的方式发送数据。发送函数有三个,分别是write、send和sendmsg。此文章为5月Day 10学习笔记,内容来源于极客时间。原创 2023-05-10 23:05:08 · 147 阅读 · 0 评论 -
Windows 10 ping www.baidu.com能够ping通,但是浏览器显示“代理服务器拒绝连接”或“代理服务器出现问题,或者地址有误”
先看一下现象,在火狐浏览器中,显示的是“代理服务器拒绝连接”。谷歌浏览器显示的是“代理服务器出现问题,或者地址有误”。Edge浏览器显示的是“代理服务器可能有问题,或地址不正确”。能够ping通。原创 2023-06-24 10:05:04 · 4165 阅读 · 0 评论 -
本地字节流套接字
这段代码创建了一个字节流本地套接字,AF_LOCAL表示类型可以认为与AF_UNIX等同,SOCK_STREAM表明使用TCP,即数据流。删除local_path对应的文件,这样可以保持幂等性。把文件绑定到套接字上,然后监听文件。接收服务器端的消息。读取客户端的消息,然后往客户端写入服务器这边格式化后代码。原创 2023-05-31 23:06:35 · 465 阅读 · 0 评论 -
网络编程实战课程使用Cmake第一次编译程序
把yolanda/CMakeLists.txt中“add_subdirectory(chap-30)”注释掉。CentOS 7.6中gcc 12.2.0如何使用源码安装cmake 3.25.3参考我以前的。此文章为5月Day 30学习笔记,内容来源于极客时间。提供一种解决方案,尝试了一下可以成功执行。创建目录build并进入里边。生成Makefile文件。进入到源代码目录里边。原创 2023-05-30 23:47:42 · 139 阅读 · 0 评论 -
Linux UDP客户端和服务端代码实现
此文章为5月Day 29学习笔记,内容来源于极客时间。原创 2023-05-29 23:17:27 · 304 阅读 · 0 评论 -
文件和套接字
此文章为5月Day 28学习笔记,内容来源于极客时间《网络编程实战》。进行执行,发现文件描述符按顺序输出,这说明。函数产生的返回值本质是一样的。原创 2023-05-28 23:42:57 · 63 阅读 · 0 评论 -
Linux中write()函数
此文章为5月Day 15学习笔记,内容来源于极客时间《网络编程实战》。把五十个“a”不换行放到file.txt文件中,可以使用。把源代码翻译成writeFile可执行文件。看一下file.txt中有多少个字符。看一下file.txt中有多少个字符。看一下file.txt中的内容,看一下file.txt中的内容,执行一下,然后再使用。原创 2023-05-16 23:27:11 · 202 阅读 · 0 评论 -
Linux读文件的函数read()
把“quick brown fox jumps over the lazy dog”不加换行符输出到file.txt文件中。文件的状态,注意file.txt是读取文件名,10是每次读入字符个数。此文章为5月Day 15学习笔记,内容来源于极客时间《网络编程实战》。,正常输入file.txt文件中的字符。可执行文件,现在输入。原创 2023-05-15 23:31:26 · 423 阅读 · 0 评论 -
Linux文件打开函数open()
此文章为5月Day 13学习笔记,内容来源于极客时间《网络编程实战》。进行执行,发现输出“原创 2023-05-14 23:03:19 · 323 阅读 · 0 评论 -
Linux中文件描述符
文件描述符是操作系统内核空间和用户空间连接的桥梁。当打开或者创建一个的时候,内核会创建相应的结构,并生成一个整数的变量传递给用户空间对应进程,然后进程就可以文件描述符进行操作。Linux用文件描述符表示设备和普通文件。文件描述符是一个整型的数据,所有对文件的操作都通过文件描述符实现。而在Windows中,这种整型数据被称为“文件句柄”。此文章为5月Day 12学习笔记,内容来源于极客时间。原创 2023-05-13 23:34:08 · 213 阅读 · 0 评论 -
基于Linux的文件分类
1.普通文件:保存在磁盘上的C文件、可执行文件以及目录等,这种文件的特性是数据在存储设备上存放,内核提供了对数据的抽象访问,是一种字节流,访问接口完全独立于磁盘上的存储数据。4.socket文件:Linux中通过网络进行通信的方式,对网络的访问可以通过对文件描述符的抽象实现,跟访问普通文件相似。3.块设备文件:磁盘是此类设备的代表,与普通文件的区别是操作系统对数据的访问进行的重新的格式设计。2.字符设备文件:是一种能够像文件一样被访问的设备,例如控制台、串口等。原创 2023-05-12 23:24:26 · 196 阅读 · 0 评论 -
TCP/IP中UDP
UDP 则不同,UDP 没有这样一个确定的上下文,它是一个不可靠的通信协议,没有重传和确认,没有有序控制,也没有拥塞控制。我们可以简单地理解为,在 IP 报文的基础上,UDP 增加的能力有限。区别详情:TCP 是一个面向连接的协议,TCP 在 IP 报文的基础上,增加了诸如重传、确认、有序传输、拥塞控制等能力,通信的双方是在一个确定的上下文中工作的。UDP 不保证报文的有效传递,不保证报文的有序,也就是说使用 UDP 的时候,我们需要做好丢包、重传、报文组装等工作。原创 2023-05-11 23:23:40 · 75 阅读 · 0 评论 -
TCP三次握手
证明客户端发送的消息,服务器接收到了,然后向客户端发送SYN包,序列号为k,服务器端进入SYN_RCVD状态。这样的话,客户端可以确认“服务端的接收和发送没问题,客户端的接收和发送没问题”,但是服务端只能确认“客户端的发送没问题,服务端的接收没问题”。3.客户端协议栈接收到ACK之后,使得应用程序从connect调用返回,向服务器发送ACK,序列号为k+1,然后connect函数返回,表示客户端到服务器的单向连接建立,客户端状态为ESTABLISED。与此相对的,是一种非阻塞式。原创 2023-05-09 23:42:51 · 75 阅读 · 0 评论 -
客户端发起连接
先初始化一个套接字,这步与服务器的一样。原创 2023-05-08 23:21:09 · 80 阅读 · 0 评论 -
Linux套接字被动连接listen函数和服务器端等待建立连接accept函数
函数的第一个参数 listensockfd 是套接字,可以叫它为 listen 套接字,因为这就是前面通过 bind,listen 一系列操作而得到的套接字。函数的返回值有两个部分,第一个部分 cliadd 是通过指针方式获取的客户端的地址,addrlen 告诉我们地址的大小。通过 listen 函数,可以将原来的"主动"套接字转换为"被动"套接字,告诉操作系统内核:“我这个套接字是用来等待用户请求的。此文章为5月Day 7学习笔记,内容来源于极客时间。是listen函数原型。原创 2023-05-07 23:18:49 · 86 阅读 · 0 评论 -
Linux创建套接字和绑定套接字
【代码】Linux网络编程。原创 2023-05-06 22:01:12 · 562 阅读 · 0 评论 -
socket套接字
服务器先使用socket()函数创建一个socket,之后使用bind()函数将自己的服务能力绑定在一个众所周知的端口上,服务器就可以使用listen()将socket转化为服务器端的socket,而accept()函数可以阻塞,等待客户端建立连接。客户端需要使用socket()函数初始化一个socket,然后使用connect()函数建立一个连接。建立好连接之后,服务器端和客户端就可以使用read()和write()进行沟通了。socket在英文中的意思是“插口,插槽”的意思。原创 2023-05-05 22:17:04 · 70 阅读 · 0 评论