最新资讯

  • 《TCP/UDP网络编程全攻略:从基础协议到并发服务器的理论与实现》

《TCP/UDP网络编程全攻略:从基础协议到并发服务器的理论与实现》

2026-01-29 00:54:22 栏目:最新资讯 3 阅读

ps:并发的实现将会放在下一章,本章主要聚焦于理论与流程
TCP特点:

面向连接的,可靠的,基于字节流的(连续的字节序列,没有消息边界。),需要三次握手来建立连接(客户端先发起请求、服务器应答、客户端应答,再进行发送数据),从而开始收发数据。还需要通过四次挥手来断开连接,确保所有未完成的数据传输都能顺利完成。并通过滑动窗口实现流量控制。

  • 具体来说,客户端调用 connect() 向服务器发送SYN包(第一次握手),服务器收到这个请求后,如果当前处于监听状态,则会响应SYN-ACK(第二次握手)。之后,客户端再回复ACK确认(第三次握手),完成三次握手过程。此时,服务器才会从 accept() 返回,表示连接已经建立成功,并准备好进行数据传输。三次握手的是SYN包,客户端请求、服务器确认、客户端再次确认。

  • 四次挥手的话是FIN包,客户端发起终止请求、服务器发送确认、服务器发送终止请求、客户端确认。

  • 滑动窗口理解:简单来说,滑动窗口就像是接收方递给发送方的一把“尺子”。这把尺子的长度(窗口大小)由接收方根据自己的“消化能力”(缓冲区空间)来决定。发送方只能在这把尺子量出来的范围内发送数据。当接收方“消化”掉一部分数据后,就把尺子往前挪一挪(滑动),并可能加长一点(增大窗口),让发送方可以继续发送。

UDP特定:

无连接,这意味着可以直接收发数据。是不可靠传输,无法确定按序抵达,无法确认数据有无丢失,基于报文(固定长度,发送的数据都会作为一个独立的“数据报”传输),没有流量控制(不会控制发送速率)和没有拥塞控制(不会因为网络拥塞而减少数据发送量)。支持广播(无差别范围攻击)与多播(有针对性的多个单位)。

简易理解:DDoS 攻击就是基于udp的特点,攻击者使用原始套接字(raw socket) 构造 UDP 数据包,伪造源 IP 地址为目标受害者的 IP,并将小型 DNS 查询请求发送到多个开放的 DNS 递归服务器。这些服务器收到请求后,会向伪造的源 IP(即受害者)返回较大的响应数据。由于响应大小远大于请求(放大效应),攻击者可以用较小的带宽消耗,导致受害者遭受巨大的入站流量冲击,最终服务瘫痪。

linux下网络通信:

基于 Socket 层的 TCP 通信流程

服务器的accept与客户端的connect就是tcp面向连接的具象化。

服务端
  1. 创建套接字socket()

  2. 定义地址结构sockaddr_in

  3. 绑定地址bind()

  4. 监听连接请求listen()

  5. 接受连接:服务器使用accept()

  6. 发送数据send()write()

  7. 接收数据recv()read() OS内核会有收发缓冲区

  8. 关闭套接字close()

客户端
  1. 创建套接字socket()

  2. 定义地址结构体sockaddr_in

  3. 发起连接:客户端使用connect(),connect优先于accept触发,因为服务器是通过listen所有connect情况并限制connect数量。最后才进行accept,accept后才可收发数据。调用connect后os内核会自动分配本地内核,从而无需bind。

  4. 发送数据send()write()

  5. 接收数据recv()read()

  6. 关闭套接字close()

没有 Socket 层的 TCP 通信

基于 Socket 层的 UDP 通信流程 少了accept和connect(与tcp相比)

服务端
  1. 创建套接字socket()

    • 使用 AF_INETSOCK_DGRAM 创建一个 UDP 套接字。

  2. 定义地址结构sockaddr_in

    • 定义并初始化服务器的 IP 地址和端口号。

  3. 绑定地址bind()

    • 将套接字与指定的 IP 地址和端口号绑定。

  4. 接收数据recvfrom()read()

    • 使用 recvfrom() 接收来自客户端的数据,并获取发送方的地址信息。

  5. 发送数据sendto()write()

    • 使用 sendto() 向特定的客户端发送数据,需要指定目标地址。

  6. 关闭套接字close()

    • 关闭套接字,释放资源。

客户端
  1. 创建套接字socket()

    • 使用 AF_INETSOCK_DGRAM 创建一个 UDP 套接字。

  2. 定义地址结构体sockaddr_in

    • 定义并初始化服务器的 IP 地址和端口号。

  3. 发送数据sendto()write() sendto触发自动绑定本地套接字

    • 使用 sendto() 向服务器发送数据,需要指定目标地址。

  4. 接收数据recvfrom()read() recvfrom() 不会触发自动绑定

    • 使用 recvfrom() 接收来自服务器的数据,并获取发送方的地址信息。

  5. 关闭套接字close()

    • 关闭套接字,释放资源。

没有 Socket 层的 UDP 通信

在没有 Socket 层的情况下,你需要自己实现 UDP 协议栈的核心功能,包括:

功能描述
构造 UDP 数据包头包括源端口、目的端口、长度、校验和等字段
构造 IP 数据包头包括源 IP、目标 IP、协议类型、校验和等
校验和计算每个协议层都要做校验和验证,否则数据包会被丢弃
发送数据包需要通过系统调用(如 sendto)配合 Raw Socket 来发送原始数据包
接收数据包需要通过系统调用(如 recvfrom)配合 Raw Socket 来接收原始数据包

tcp与udp客户端的bind(linux)

已知无论是哪个协议,服务器的套接字都会由bind来进行地址结构体的绑定。 而客户端一般不会显式调用bind,但是客户端的套接字实际也是需要绑定地址结构体的,两种协议在客户端的绑定过程和触发时机不同,但均由内核来进行套接字与地址结构体的绑定。

tcp是面向连接的,所以客户端有显示的connect,这就是面向连接的具象化,并且客户端的套接字绑定地址其实隐式的在该函数中触发。 触发时机:在tcp中,用户端的clientsock的地址会在connect函数时由内核分配。TCP客户端的套接字在未显式绑定本地端口时,connect()函数将会立即分配一个本地端口,让客户端套接字与该地址绑定,这个行为是隐式的,由内核完成,在这之后,会触发三次握手,让客户端套接字与服务器套接字进行通信。并且其端口分配机制与UDP的connect不同,其允许复用TIME_WAIT端口(取决于系统配置)。connect隐式绑定了客户端套接字的地址的时候就会一直持续到关闭。timewait是为了让地址无法马上被复用。

UDP是无连接的,所以不会有connect,当客户端调用sendto时,如果套接字未绑定(即未显示调用bind函数时),内核会自动分配一个本地端口和IP。一旦分配后,这个本地地址就会被固定,后续的sendto不会重新分配(调用多次sendto进行通信,内核只会在第一次的时候将套接字与地址结构体绑定,后续的sendto只会单纯通信),所以不论多少次sendto,客户端套接字结构体只会绑定一次地址直到套接字关闭。 触发时机:在udp中,用户端的clientsock的地址会根据sendto函数中的servaddr由内核去分配。(与recvfrom无关)

timewait是为了让地址无法马上被复用。作用是为了保证4次挥手!!(可靠关闭与数据隔离)

//tcp 服务器
socket();
sockaddr_in
bind()
listen()
accept()
send/write()
recv/read()
close()
​
//tcp 客户端
socket();
sockaddr_in
connect() //内核分配地址   
send/write()
recv/read()
close()
​
//udp 服务器
socket();
sockaddr_in
bind()
recvfrom()
sendto()
close()
​
//udp 客户端
socket();
sockaddr_in
sendto()  //内核分配地址
recvfrom()
close()

TCP服务器套接字创建流程与意义
socket(); 
// 创建监听套接字,参数说明:
//   1. domain: 告知是选择 IPv4 (AF_INET) 还是 IPv6 (AF_INET6) 的地址族。
//   2. type:   告知是选择 TCP (SOCK_STREAM) 还是 UDP (SOCK_DGRAM) 协议。
//   3. protocol: 通常为 0。本意是告知选取了哪个具体协议,但由于前两个参数已唯一确定协议(如 AF_INET + SOCK_STREAM = TCP),所以填 0 即可,由系统自动选择。
​
struct sockaddr_in addr; 
// 创建 IPv4 地址结构体。有了这个结构体,才能将套接字绑定到一个具体的网络地址上。
// 结构体成员:
//   addr.sin_family = AF_INET;          // 地址族:IPv4
//   addr.sin_port = htons(8080);        // 端口号:8080 (需转换为网络字节序)
//   addr.sin_addr.s_addr = inet_addr("192.168.1.100"); // IP地址 (转换为网络字节序)
​
bind(); 
// 绑定套接字,参数:
//   1. sockfd: 要绑定的套接字描述符。
//   2. addr:   指向 sockaddr_in 结构体的指针(需强制转换为 struct sockaddr*)。
//   3. addrlen: 地址结构体的长度 (sizeof(addr))。
// 作用:将套接字与一个本地网络地址(IP + Port)关联起来。此后,客户端可以通过 "192.168.1.100:8080" 访问该服务器。
​
listen(); 
// 将套接字设置为监听状态,参数:
//   1. sockfd: 监听套接字描述符。
//   2. backlog: 监听队列的大小,即等待 accept() 处理的已完成三次握手的连接请求的最大数量。
// 作用:使服务器开始被动等待客户端的连接请求。
​
accept(); 
// 接受一个客户端的连接请求,参数:
//   1. sockfd: 监听套接字描述符。
//   2. cliaddr: 指向客户端地址结构体 (struct sockaddr_in*) 的指针,用于获取客户端的 IP 和端口(可选,可传 NULL)。
//   3. addrlen: 客户端地址结构体长度的指针(可选,可传 NULL)。
// 返回值:一个新的套接字描述符,这个套接字是**专用于与该特定客户端进行通信的**。
// 说明:监听套接字 (sockfd) 本身不用于数据传输,它只负责接收新的连接请求。
​
// 总结:TCP 通信中涉及的套接字:
//   1. 服务器监听套接字:用于监听和接受新连接。
//   2. 服务器通信套接字:由 accept() 返回,用于与一个特定的客户端进行数据收发。   由这个套接字进行通信
//   3. 客户端套接字:客户端调用 socket() 创建的套接字。
​
send() / write(); 
// 通过通信套接字向对方发送数据。
​
recv() / read(); 
// 通过通信套接字从对方接收数据。
​
close(); 
// 关闭套接字。通常,服务器需要关闭每个与客户端通信的套接字,最后关闭监听套接字。
TCP客户端套接字创建流程与含义
socket(); 
// 创建客户端套接字,参数同上。例如:socket(AF_INET, SOCK_STREAM, 0); 创建 TCP 套接字。
​
struct sockaddr_in serv_addr; 
// 创建服务器地址结构体,用于指定要连接的服务器地址。
// 成员设置同服务器端:
//   serv_addr.sin_family = AF_INET;
//   serv_addr.sin_port = htons(8080);           // 服务器的端口号
//   serv_addr.sin_addr.s_addr = inet_addr("192.168.1.100"); // 服务器的 IP 地址
​
connect(); 
// 客户端发起连接请求,参数:
//   1. sockfd: 客户端套接字描述符。
//   2. serv_addr: 指向服务器地址结构体的指针(需强制转换为 struct sockaddr*)。
//   3. addrlen: 服务器地址结构体的长度 (sizeof(serv_addr))。
// 作用:客户端通过此函数向服务器的监听套接字发起连接(触发三次握手)。
// 注意:客户端通常不需要调用 bind()。客户端的本地 IP 和端口由操作系统内核在 connect() 时自动分配(称为临时端口或 ephemeral port)。
//与服务器不同,客户端的套接字没有显示的设置自己的结构体地址,而是由内核分配,客户端只需要设置服务器的监听套接字同款的地址结构体。
​
send() / write(); 
// 通过客户端套接字向服务器发送数据。
​
recv() / read(); 
// 通过客户端套接字从服务器接收数据。
​
close(); 
// 关闭客户端套接字。
UDP服务器套接字创建流程与含义
socket(); 
// 创建套接字,参数说明:
//   1. domain: 告知是选择 IPv4 (AF_INET) 还是 IPv6 (AF_INET6) 的地址族。
//   2. type:   告知是选择 UDP 协议 (SOCK_DGRAM)。
//   3. protocol: 通常为 0。因为 AF_INET + SOCK_DGRAM 已唯一确定使用 UDP 协议,所以填 0 即可。
​
struct sockaddr_in addr; 
// 创建 IPv4 地址结构体,用于绑定服务器的监听地址。
// 结构体成员:
//   addr.sin_family = AF_INET;          // 地址族:IPv4
//   addr.sin_port = htons(8080);        // 端口号:8080 (需转换为网络字节序)
//   addr.sin_addr.s_addr = inet_addr("192.168.1.100"); // IP地址 (转换为网络字节序)
//   // 也可以使用 INADDR_ANY (0.0.0.0),表示绑定到机器的所有网络接口。
​
bind(); 
// 绑定套接字,参数:
//   1. sockfd: 要绑定的套接字描述符。
//   2. addr:   指向 sockaddr_in 结构体的指针(需强制转换为 struct sockaddr*)。
//   3. addrlen: 地址结构体的长度 (sizeof(addr))。
// 作用:将 UDP 套接字与一个本地网络地址(IP + Port)关联起来。此后,客户端可以向 "192.168.1.100:8080" 发送数据包。
​
recvfrom(); 
// 接收数据包并获取发送方地址,参数:
//   1. sockfd: 绑定的套接字描述符。
//   2. buf:    指向接收缓冲区的指针。
//   3. len:    缓冲区大小。
//   4. flags:  通常为 0。
//   5. src_addr: 指向客户端地址结构体 (struct sockaddr_in*) 的指针,用于获取发送方的 IP 和端口。
//   6. addrlen: 指向客户端地址结构体长度的指针 (初始值为 sizeof(struct sockaddr_in))。
// 作用:从任意客户端接收一个数据报,并记录下该客户端的地址信息。这是 UDP 通信的核心接收函数。
​
sendto(); 
// 向指定地址发送数据包,参数:
//   1. sockfd: 套接字描述符。
//   2. buf:    指向要发送数据的指针。
//   3. len:    数据长度。
//   4. flags:  通常为 0。
//   5. dest_addr: 指向目标地址结构体 (struct sockaddr_in*) 的指针(即客户端地址,来自 recvfrom)。
//   6. addrlen: 目标地址结构体的长度 (sizeof(struct sockaddr_in))。
// 作用:向特定的客户端(通过其地址)发送一个数据报。
​
close(); 
// 关闭套接字。
UDP客户端套接字创建流程与含义
socket(); 
// 创建客户端套接字,参数同上。例如:socket(AF_INET, SOCK_DGRAM, 0); 创建 UDP 套接字。
​
struct sockaddr_in serv_addr; 
// 创建服务器地址结构体,用于指定要发送数据的目标服务器。
// 成员设置:
//   serv_addr.sin_family = AF_INET;
//   serv_addr.sin_port = htons(8080);           // 服务器的端口号
//   serv_addr.sin_addr.s_addr = inet_addr("192.168.1.100"); // 服务器的 IP 地址
​
// 注意:UDP 客户端通常不需要调用 connect(),但也可以调用。
// 如果调用 connect(),则可以将套接字与一个特定服务器“关联”起来,之后就可以使用 send()/recv() 而不是 sendto()/recvfrom()。
​
sendto(); 
// 向服务器发送数据包,参数:
//   1. sockfd: 客户端套接字描述符。
//   2. buf:    指向要发送数据的指针。
//   3. len:    数据长度。
//   4. flags:  通常为 0。
//   5. dest_addr: 指向服务器地址结构体 (struct sockaddr_in*) 的指针。
//   6. addrlen: 服务器地址结构体的长度 (sizeof(serv_addr))。
// 作用:将数据报发送到指定的服务器地址。
​
recvfrom(); 
// 接收来自服务器的响应数据包,参数:
//   1. sockfd: 客户端套接字描述符。
//   2. buf:    指向接收缓冲区的指针。
//   3. len:    缓冲区大小。
//   4. flags:  通常为 0。
//   5. src_addr: (可选) 指向服务器地址结构体的指针,用于验证数据来源。
//   6. addrlen: (可选) 服务器地址结构体长度的指针。
// 作用:接收服务器的响应。由于 UDP 是无连接的,需要 recvfrom() 来确认数据来源。
​
// 可选:如果之前调用了 connect(serv_addr),则可以使用:
// recv();   // 等价于 recvfrom(),但不需要指定地址。
// send();   // 等价于 sendto(),但不需要指定地址。
​
close(); 
// 关闭客户端套接字。

读写函数(linux)

函数TCPUDP是否异步?特点
read() / write()✅ 可用⚠️ 不推荐❌ 同步简单易用,适用于 TCP,UDP 中缺乏地址信息支持
recv() / send()✅ 推荐⚠️ 需要使用 connect()❌ 同步TCP 标准接口,UDP 中可用但需先调用 connect()
recvfrom() / sendto()⚠️ 可用✅ 推荐❌ 同步适用于无连接的 UDP,可指定/获取目标地址
recvmsg() / sendmsg()✅ 推荐✅ 推荐❌ 同步功能最强大,支持多缓冲区、辅助数据(如控制消息)
readv() / writev()✅ 可用⚠️ 少用❌ 同步支持分散/聚集 I/O,适用于 TCP 或已连接 UDP
splice() / tee()✅ 高效零拷贝❌ 不适用❌ 同步常用于高性能 TCP 数据传输,需配合管道使用
mmap()⚠️ 特殊用途❌ 不适用❌ 同步可将 socket 映射为内存(较少见)
io_uring 相关接口(现代异步)✅ 推荐✅ 推荐✅ 异步(现代 AIO)Linux 最新高效的异步 I/O 框架,性能极佳
aio_read() / aio_write()⚠️ 有限支持⚠️ 有限支持✅ 异步(传统 POSIX AIO)POSIX 异步 I/O,对 socket 支持较弱

tcp:一般用send和recv

udp:一般用sendto和recvfrom

  • 上述两者均可以用write和read,read() / write()POSIX 标准的通用文件 I/O 函数,适用于所有“文件描述符”(包括普通文件、管道、socket 等)Linux一切皆文件,所以这个是无敌的。

  • 但还是建议用send与recv系列,send() / recv() 系列是 专为 socket 设计的函数,提供了更多网络通信相关的控制选项(如 flags、地址信息等)。

  • recvmsg() / sendmsg() 功能最全,但也更为复杂:

Windows 下网络通信:

Windows 使用 Winsock API(Windows Sockets) 实现网络通信,其接口设计与 Linux 非常相似,但也有一些关键区别,比如初始化步骤、错误处理方式、部分函数命名等。


基于 Winsock 层的 TCP 通信流程

服务端
  1. 初始化 Winsock 库

    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData); // 初始化 Winsock 2.2
  2. 创建套接字socket()

    SOCKET sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  3. 定义地址结构sockaddr_in

  4. 绑定地址bind()

  5. 监听连接请求listen()

  6. 接受连接accept()

  7. 发送数据send()WSASend()

    • WSASend() 支持重叠 I/O(异步操作)

  8. 接收数据recv()WSARecv()

  9. 关闭套接字closesocket()

  10. 清理 Winsock库

    WSACleanup();

客户端
  1. 初始化 Winsock 库

    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData); // 初始化 Winsock 2.2
  2. 创建套接字socket()

  3. 定义地址结构体sockaddr_in

  4. 发起连接connect()

    • 调用后 OS 内核会自动分配本地端口,无需手动调用 bind()

  5. 发送数据send() / WSASend()

  6. 接收数据recv() / WSARecv()

  7. 关闭套接字closesocket()

  8. 清理 Winsock

    WSACleanup();

没有 Winsock 层的 TCP 通信(不常见)

  • 在 Windows 中几乎不可能绕过 Winsock 直接操作 TCP/IP 协议栈。

  • 如果需要底层控制,可以使用 NDIS(Network Driver Interface Specification) 或开发驱动程序。

  • 更常见的“伪原始”操作是通过 Raw Socket(需管理员权限),但功能受限:

    • 只能构造 IP/TCP 头部,不能完全控制协议栈;

    • Windows Vista 后限制较多,不推荐用于普通应用。


基于 Winsock 层的 UDP 通信流程

服务端
  1. 初始化 Winsock 库

    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData); // 初始化 Winsock 2.2
  2. 创建套接字socket()

    SOCKET sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  3. 定义地址结构sockaddr_in

  4. 绑定地址bind()

  5. 接收数据recvfrom()WSARecvFrom()

    • 推荐使用 recvfrom() 获取发送方地址信息

  6. 发送数据sendto()WSASendTo()

  7. 关闭套接字closesocket()

  8. 清理 Winsock库

    WSACleanup();

客户端
  1. 初始化 Winsock 库

    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData); // 初始化 Winsock 2.2
  2. 创建套接字socket()

  3. 定义地址结构体sockaddr_in

  4. 发送数据sendto()

    • 第一次调用 sendto() 时,如果未调用 bind(),系统内核会自动分配一个本地端口并绑定。

  5. 接收数据recvfrom()

    • 不会触发本地地址绑定

  6. 关闭套接字closesocket()

  7. 清理 Winsock库

    WSACleanup();

没有 Winsock 层的 UDP 通信(不常见)

  • 类似 TCP,无法真正绕过 Winsock;

  • 若想操作原始 UDP 数据包,可使用 Raw Socket(需要管理员权限);

  • 手动构造 UDP 数据包头、IP 数据包头,并计算校验和;

  • 使用 sendto() 发送原始数据包;

  • 使用 recvfrom() 接收原始数据包;

⚠️ 注意:Windows 对 Raw Socket 的支持非常有限,仅允许构造 ICMP、UDP、TCP 等特定类型的包,且某些版本禁止构造 TCP 包。


TCP 与 UDP 客户端的 bind 行为(Windows)

与linux中情况一致。都是用connect与sendto来自动绑定本地套接字

协议自动绑定时机是否固定地址允许复用 TIME_WAIT
TCPconnect()✅ 是⚠️ 取决于 SO_REUSEADDR
UDPsendto()✅ 是✅ 可复用(默认)
  • TCP 客户端:在调用 connect() 时由系统自动分配本地端口;

  • UDP 客户端:第一次调用 sendto() 时由系统自动绑定本地端口;

  • 一旦绑定,后续操作不会再重新绑定;

  • 可以通过 bind() 显式指定本地端口。


读写函数(Windows)

函数TCPUDP特点
send() / recv()✅ 推荐❌ 必须先 connect
sendto() / recvfrom()⚠️ 可用✅ 推荐
WSASend() / WSARecv()✅ 异步/重叠 I/O⚠️ 可用于 UDP
WSASendTo() / WSARecvFrom()⚠️✅ 异步 UDP
write() / read()✅ 可用❌ 不可用(Windows 不推荐)

⚠️ 在 Windows 上,虽然 write()read() 可用于 TCP 套接字(因为它们继承自 POSIX 兼容层),但在 UDP 中不建议使用,因为缺乏地址信息支持。


总结对比表:Linux vs Windows
功能LinuxWindows
初始化网络库不需要WSAStartup() / WSACleanup()
错误码获取errnoWSAGetLastError()
关闭套接字close()closesocket()
通用读写read() / write()read() / write()(仅限 TCP)
异步 I/Osend() / recv() + epoll/selectWSASend() / WSARecv() + IOCP
Raw Socket 权限root管理员
Raw Socket 支持较强有限制

SOCKET的阻塞与非阻塞

Linux 下 socket 情况说明

默认行为:
  • 通过 socket() 创建的 socket 默认是阻塞模式(blocking)

  • 所有与之相关的 I/O 函数(如 read(), write(), send(), recv() 等)在没有数据或缓冲区满时会 阻塞当前线程,直到操作完成或出错。

如何设置为非阻塞?

使用 fcntl() 设置 socket 标志位:

int flags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, flags | O_NONBLOCK); // 设置为非阻塞
非阻塞行为表现:
  • 如果调用 read()recv() 但当前没有数据可读,函数立即返回 -1,并设置 errno == EAGAINEWOULDBLOCK

  • 如果调用 write()send() 但发送缓冲区已满,函数也立即返回 -1,并设置 errno == EAGAIN

常见配合使用机制:
  • 多路复用模型:epoll, poll, select

  • 异步模型(现代):io_uring

  • 异步模型(传统):POSIX AIO(对 socket 支持有限)


Windows 下 socket 情况说明

默认行为:
  • 使用 socket() 创建的 socket 默认也是阻塞模式(blocking)

  • 所有 I/O 函数(如 recv(), send(), ReadFile() 等)在无数据或缓冲区满时也会 阻塞当前线程

如何设置为非阻塞?

使用 ioctlsocket() 设置非阻塞标志:

u_long nb = 1;
ioctlsocket(sock, FIONBIO, &nb); // 设置为非阻塞
非阻塞行为表现:
  • 如果调用 recv()WSARecv() 但当前没有数据可读,函数立即返回 SOCKET_ERROR,并设置 WSAGetLastError() == WSAEWOULDBLOCK

  • 类似地,send() 在缓冲区满时也立即返回错误码。

常见配合使用机制:
  • 多路复用模型:select, WSAPoll

  • 异步模型(基于事件):WSAAsyncSelect

  • 异步模型(基于重叠结构体):WSARecv, WSASend + OVERLAPPED

  • 最强大异步模型:完成端口(I/O Completion Ports, IOCP)


Linux vs Windows Socket 对照表

对比维度LinuxWindows
默认 socket 模式阻塞阻塞
是否需要显式设置非阻塞✅ 是(fcntl(fd, F_SETFL, O_NONBLOCK)✅ 是(ioctlsocket(sock, FIONBIO, &nb)
非阻塞时 I/O 返回值-1,errno=EAGAIN / EWOULDBLOCKSOCKET_ERROR,WSAGetLastError=WSAEWOULDBLOCK
常用多路复用模型epoll, poll, selectselect, WSAPoll
异步 I/O 接口io_uring, aio_read(有限)WSARecv, WSASend + IOCP
是否支持零拷贝异步 I/O✅ 支持 io_uring❌ 不直接支持
文件描述符类型intSOCKET(本质是句柄)

总结一句话:

Linux 和 Windows 下 socket 默认都是阻塞的,都需要显式设置才能进入非阻塞模式。虽然两者接口不同,但设计思想相似:非阻塞行为由 socket 模式决定,而不是 I/O 函数本身;选择不同的 I/O 模型(同步、异步、多路复用)决定了程序的并发能力和性能表现。


并发服务器(从单线程开始)

服务器与客户端在单线程模式下同一时刻只能进行一对一通信。若要实现一对多的并发通信,通常可以采用多进程或多线程模型,也可以使用 I/O 多路复用(I/O Multiplexing)技术,也可以采用异步IO方式。

之所以只能一对一通信,是因为像 accept() 这样的监听函数,以及 send()/sendto()recv()/recvfrom() 等通信函数,在没有数据到达或无法立即完成操作时,默认都会进入阻塞状态。

accept() 为例,操作系统为其维护了一个输入缓冲区。当没有新的客户端连接到来时,该缓冲区为空,调用 accept() 的线程会进入阻塞状态,直到有新连接到达、缓冲区变为非空,程序才会继续执行。

accept 和阻塞 :

阻塞模式:这是 socket 的默认行为。当没有新连接到达时,accept() 会阻塞当前线程,直到有新连接到来。

非阻塞模式:可以通过 fcntl(fd, F_SETFL, O_NONBLOCK) 将监听 socket 设置为非阻塞模式。此时,如果没有连接到达,accept() 会立即返回 -1,并设置 errnoEAGAINEWOULDBLOCK,表示“当前无连接可接受”。

因此,在一个线程(或进程)中,由于 accept()recv() 等函数是阻塞的(源头是socket是阻塞状态),程序(该线程)在同一时刻只能处理一个客户端的连接和通信请求,其他客户端必须等待当前请求完成后才能被服务。

引入多线程/多进程模型 :

为了提高并发处理能力,可以引入多线程或多进程模型来分别处理不同的客户端连接。 并发:在同一时间段内处理多个任务的能力。即处理多个客户端的连接,即accept返回的通信socketfd

多线程核心思想是:为每个新连接创建独立的线程来负责处理通信任务(一个线程对应一个客户端连接),各线程之间互不干扰,从而避免主线程因(阻塞)等待某个连接的数据而影响其他连接的响应速度。 服务器用多个线程/进程 避免因为阻塞函数等待 如果等待 则只是一对一。

弊端:

然而,为每个连接创建独立线程或进程的方式虽然提高了并发能力,但也带来了较大的系统资源消耗和上下文切换开销。因此,对于高并发场景,这种方式并不理想。

引入 I/O 复用技术:

于是,我们引入了 I/O 多路复用(I/O Multiplexing)技术——它允许程序同时监控多个文件描述符(如 socket),并等待其中任意一个进入可操作状态(如可读、可写等)。这与传统的“串行式”处理方式不同:后者一次只能监听一个 socket,必须完成当前连接的所有操作后才能处理下一个。 I/O 复用特别适用于需要同时管理多个网络连接的服务器程序,因为它可以在单个线程中高效地处理成百上千个并发连接,显著提升性能。

I/O复用技术可以让单个进程或线程能够同时监控多个 I/O 流。它允许程序在多个文件描述符(如 socket)上等待事件发生(比如数据到达、可以发送等),而不需要为每个连接创建独立的线程或进程。这与传统的“阻塞式串行处理”不同:以前必须在一个连接完成全部读写操作后,才能处理下一个连接;而 I/O 复用则可以在多个连接之间高效切换,仅在有数据可读或可写时才进行处理。

IO复用,核心思想就是:一个线程、进程,能处理多个客户端连接。

io复用下:同时存在多个连接,谁有读写情况就处理谁。

传统方法:同时只能存在一个连接,当它的内容处理完,关闭以后,才能有下一个连接,并再次为之处理,循环往复。

引入异步 I/O 模型:

windows的iocp,linux的io_uring。

参考:

0voice·Github

本文地址:https://www.yitenyun.com/1007.html

搜索文章

Tags

#服务器 #python #pip #conda #远程工作 #ios面试 #ios弱网 #断点续传 #ios开发 #objective-c #ios #ios缓存 香港站群服务器 多IP服务器 香港站群 站群服务器 #kubernetes #笔记 #平面 #容器 #linux #学习方法 #运维 #学习 #docker #后端 #数据库 #进程控制 #开发语言 #云原生 #iventoy #VmWare #OpenEuler #人工智能 #node.js #fastapi #html #css #MobaXterm #ubuntu #Conda # 私有索引 # 包管理 #Trae #IDE #AI 原生集成开发环境 #Trae AI #物联网 #websocket #低代码 #爬虫 #音视频 #cpolar #算法 #大数据 #内网穿透 #网络 #github #git #缓存 #数信院生信服务器 #Rstudio #生信入门 #生信云服务器 #vscode #mobaxterm #深度学习 #计算机视觉 #开源 #vllm #大模型 #Streamlit #Qwen #本地部署 #AI聊天机器人 #RTP over RTSP #RTP over TCP #RTSP服务器 #RTP #TCP发送RTP #android #腾讯云 #c# #web安全 #安全 #unity #游戏引擎 #需求分析 #nginx #tcp/ip #golang #java #redis #我的世界 #hadoop #hbase #hive #zookeeper #spark #kafka #flink #凤希AI伴侣 #udp #c++ #json #jmeter #功能测试 #软件测试 #自动化测试 #职场和发展 #prometheus #gpu算力 #grafana #kylin #qt #ping通服务器 #读不了内网数据库 #bug菌问答团队 #ssh #ide #jvm #n8n #windows #嵌入式编译 #ccache #distcc #C++ #oracle #云计算 #我的世界服务器搭建 #minecraft #http #Spring AI #MCP服务器 #STDIO协议 #Streamable-HTTP #McpTool注解 #服务器能力 #银河麒麟高级服务器操作系统安装 #银河麒麟高级服务器V11配置 #设置基础软件仓库时出错 #银河麒高级服务器系统的实操教程 #生产级部署银河麒麟服务系统教程 #Linux系统的快速上手教程 #AI #大模型学习 #javascript #todesk #asp.net大文件上传 #asp.net大文件上传下载 #asp.net大文件上传源码 #ASP.NET断点续传 #asp.net上传文件夹 #jar #分阶段策略 #模型协议 #flutter #数码相机 #Dell #PowerEdge620 #内存 #硬盘 #RAID5 #架构 #asp.net #sqlserver #改行学it #创业创新 #程序员创富 #centos #面试 #claude #cpp #项目 #高并发 #arm开发 #企业开发 #ERP #项目实践 #.NET开发 #C#编程 #编程与数学 #gemini #gemini国内访问 #gemini api #gemini中转搭建 #Cloudflare #银河麒麟 #系统升级 #信创 #国产化 #华为云 #部署上线 #动静分离 #Nginx #新人首发 #多个客户端访问 #IO多路复用 #回显服务器 #TCP相关API #编辑器 #金融 #mcp #金融投资Agent #Agent #科技 #个人博客 #网络协议 #网络安全 #系统架构 #测试工具 #嵌入式硬件 #单片机 #深度优先 #DFS #守护进程 #复用 #screen #RAID #RAID技术 #磁盘 #存储 #SSH # 双因素认证 # TensorFlow #毕设 #rustdesk #p2p #unity3d #游戏 #服务器框架 #Fantasy #elasticsearch #微信小程序 #小程序 #源码 #闲置物品交易系统 #毕业设计 #pytorch #vue.js #前端 #umeditor粘贴word #ueditor粘贴word #ueditor复制word #ueditor上传word图片 #IPv6 #DNS #性能优化 #华为 #智能路由器 #django #flask #web3.py #ollama #ai #llm #transformer #prompt #react.js #swagger #php #java-ee #mamba #计算机 #树莓派4b安装系统 #时序数据库 #1024程序员节 #Android #Bluedroid #智能手机 #jupyter #mysql #AIGC #Ansible #Playbook #AI服务器 #journalctl #AI论文写作工具 #学术写作辅助 #论文创作效率提升 #AI写论文实测 #电气工程 #C# #PLC #课程设计 #MCP #sql #压力测试 #ssl #spring boot #libosinfo #openlayers #bmap #tile #server #vue #电脑 #自动化 #c语言 #jenkins #maven #gitlab #vuejs #eBPF #stm32 #高级IO #select #计算机网络 #语音识别 #说话人验证 #声纹识别 #CAM++ #ansible #Windows #gitea #macos #FTP服务器 #scala #测试用例 #网站 #截图工具 #批量处理图片 #图片格式转换 #图片裁剪 #微信 #健身房预约系统 #健身房管理系统 #健身管理系统 #X11转发 #Miniconda #mcu #debian #apache #聊天小程序 #算力一体机 #ai算力服务器 #tdengine #制造 #涛思数据 #Proxmox VE #虚拟化 #VMware #spring #交互 #tomcat #fiddler #NPU #CANN #cosmic #阿里云 #screen 命令 #远程桌面 #远程控制 #ModelEngine #JumpServer #堡垒机 #AI编程 #mvp #个人开发 #设计模式 #振镜 #振镜焊接 #teamviewer #单元测试 #集成测试 #YOLO # Triton # 目标检测 #DisM++ # GLM-4.6V # 系统维护 #京东云 #DeepSeek #蓝耘智算 #版本控制 #Git入门 #开发工具 #代码托管 #ida #web server #请求处理流程 #SRS #流媒体 #直播 #数据结构 #分布式 #研发管理 #禅道 #禅道云端部署 #政务 #uni-app #H5 #手机h5网页浏览器 #安卓app #苹果ios APP #手机电脑开启摄像头并排查 #rocketmq #selenium #密码学 #可信计算技术 #Clawdbot #个人助理 #数字员工 #CPU #测评 #CCE #Dify-LLM #Flexus #Nacos #web #微服务 #chrome #媒体 #cursor #puppeteer #KMS #slmgr #YOLOFuse # Base64编码 # 多模态检测 #系统安全 #进程 #操作系统 #进程创建与终止 #shell #xlwings #Excel #spring cloud #nfs #iscsi #SPA #单页应用 #翻译 #RustDesk #IndexTTS 2.0 #本地化部署 #YOLOv8 # Docker镜像 #麒麟OS #文件管理 #NAS #文件服务器 #jetty #前端框架 #负载均衡 #scanf #printf #getchar #putchar #cin #cout #大语言模型 #程序员 #车辆排放 #SA-PEKS # 关键词猜测攻击 # 盲签名 # 限速机制 #统信UOS #服务器操作系统 #win10 #qemu #pycharm #ms-swift # 大模型 # 模型训练 #经验分享 #pve #langchain #win11 #排序算法 #jdk #排序 #PyTorch # 高并发部署 #ddos #vps #大模型应用 #API调用 #PyInstaller打包运行 #服务端部署 #数据仓库 #软件 #本地生活 #电商系统 #商城 #sqlite #openEuler #欧拉 #epoll #aiohttp #asyncio #异步 #wordpress #雨云 #实时音视频 #业界资讯 #.netcore #部署 #https #LoRA # lora-scripts # 模型微调 #openresty #lua #自然语言处理 #神经网络 #intellij-idea #rdp #Go并发 #高并发架构 #Goroutine #系统设计 #Dify #ARM架构 #鲲鹏 #数据分析 #SSH反向隧道 # Miniconda # Jupyter远程访问 #EMC存储 #存储维护 #NetApp存储 #TCP #客户端 #嵌入式 #DIY机器人工房 #硬件架构 #Termux #Samba #Linux #notepad++ #信令服务器 #Janus #MediaSoup #chatgpt #PTP_1588 #gPTP #rtsp #转发 #rust #视频去字幕 #CVE-2025-61686 #漏洞 #路径遍历高危漏洞 #webrtc #idm #harmonyos #鸿蒙PC #进程等待 #wait #waitpid #万悟 #联通元景 #智能体 #镜像 #pdf #大模型教程 #AI大模型 #结构体 #web服务器 #Android16 #音频性能实战 #音频进阶 #esp32教程 #SSE # AI翻译机 # 实时翻译 #VMWare Tool #H5网页 #网页白屏 #H5页面空白 #资源加载问题 #打包部署后网页打不开 #HBuilderX #deepseek #postgresql #心理健康服务平台 #心理健康系统 #心理服务平台 #心理健康小程序 #鸭科夫 #逃离鸭科夫 #鸭科夫联机 #鸭科夫异地联机 #开服 #北京百思可瑞教育 #百思可瑞教育 #北京百思教育 #无人机 #Deepoc #具身模型 #开发板 #未来 #散列表 #哈希算法 #risc-v #MC #SSH公钥认证 # PyTorch # 安全加固 #idea #intellij idea #dify #信号处理 #GPU服务器 #8U #5G #搜索引擎 #AutoDL #leetcode #Llama-Factory # 树莓派 # ARM架构 #跨域 #发布上线后跨域报错 #请求接口跨域问题解决 #跨域请求代理配置 #request浏览器跨域 #运维开发 #memcache #1panel #vmware #C2000 #TI #实时控制MCU #AI服务器电源 #UDP的API使用 #处理器 #iBMC #UltraISO #黑群晖 #虚拟机 #无U盘 #纯小白 #支付 #东方仙盟 #银河麒麟操作系统 #openssh #华为交换机 #信创终端 #API限流 # 频率限制 # 令牌桶算法 #bash #智能体来了 #智能体对传统行业冲击 #行业转型 #AI赋能 #蓝湖 #Axure原型发布 #RAG #LLM #chat #YOLO26 #目标检测 #远程开发 #SAP #ebs #metaerp #oracle ebs #milvus #springboot #知识库 #910B #昇腾 #postman #Anaconda配置云虚拟环境 #交通物流 #机器学习 #winscp #openHiTLS #TLCP #DTLCP #商用密码算法 #ONLYOFFICE #MCP 服务器 #ArkUI #ArkTS #鸿蒙开发 #aws #laravel #node #zabbix #bond #服务器链路聚合 #网卡绑定 #svn #证书 #scrapy #fabric #AI写作 #服务器繁忙 #蓝牙 #LE Audio #BAP #powerbi #serverless #go #学术论文创作 #论文效率提升 #MBA论文写作 #参数估计 #矩估计 #概率论 #HeyGem # 数字人系统 # 远程部署 #adb #语言模型 #连接数据库报错 #推荐算法 #链表 #tensorflow #arm #Node.js # CosyVoice3 # child_process #dlms #dlms协议 #逻辑设备 #逻辑设置间权限 #mybatis #scikit-learn #随机森林 #安全威胁分析 #spine #仙盟创梦IDE #GLM-4.6V-Flash-WEB # AI视觉 # 本地部署 #硬件工程 #智能家居 #POC #问答 #交付 #动态规划 #pyqt #STDIO传输 #SSE传输 #WebMVC #WebFlux #bootstrap #3d #Minecraft #Minecraft服务器 #PaperMC #我的世界服务器 #ipmitool #BMC #C #kmeans #聚类 #文件IO #输入输出流 #信息与通信 #tcpdump #embedding #kong #Kong Audio #Kong Audio3 #KongAudio3 #空音3 #空音 #中国民乐 #visual studio code #Java #小艺 #鸿蒙 #搜索 #mariadb #代理模式 #Spring AOP #LangGraph #CLI #Python #JavaScript #langgraph.json #paddleocr #企业级存储 #网络设备 #word #Smokeping #wsl #产品经理 #就业 #zotero #WebDAV #同步失败 #工具集 #国产操作系统 #麒麟 #V11 #kylinos #raid #raid阵列 #KMS激活 #论文阅读 #软件工程 #Langchain-Chatchat # 国产化服务器 # 信创 #安卓 #numpy #CSDN #LobeChat #vLLM #GPU加速 #webpack #database #儿童AI #图像生成 #星图GPU #海外服务器安装宝塔面板 #开源工具 #Host #渗透测试 #SSRF #Tracker 服务器 #响应最快 #torrent 下载 #2026年 #Aria2 可用 #迅雷可用 #BT工具通用 #.net #net core #kestrel #web-server #asp.net-core #大模型开发 #FASTMCP #ZooKeeper #ZooKeeper面试题 #面试宝典 #深入解析 #大模型部署 #mindie #大模型推理 #Puppet # IndexTTS2 # TTS #联机教程 #局域网联机 #局域网联机教程 #局域网游戏 #集成学习 #简单数论 #埃氏筛法 #ui #分类 #CosyVoice3 # 语音合成 #windows11 #microsoft #系统修复 #模型训练 #codex #云服务器 #个人电脑 #C语言 #Harbor #x86_64 #数字人系统 #MC群组服务器 #yum #机器人 #CS2 #debian13 #三维 #3D #三维重建 #其他 #unix #fpga开发 #信创国产化 #达梦数据库 #RXT4090显卡 #RTX4090 #深度学习服务器 #硬件选型 #uip #echarts #GPU ##租显卡 #树莓派 #温湿度监控 #WhatsApp通知 #IoT #MySQL #黑客技术 #文件上传漏洞 #Kylin-Server #服务器安装 #LangFlow # 智能运维 # 性能瓶颈分析 # GPU租赁 # 自建服务器 #devops #SMTP # 内容安全 # Qwen3Guard #遛狗 #bug #MinIO服务器启动与配置详解 #代理 #平板 #零售 #智能硬件 #CTF #A2A #GenAI #插件 #开源软件 #agent #ai大模型 #FHSS #cesium #可视化 # 一锤定音 # 大模型微调 #服务器解析漏洞 #nodejs #NFC #智能公交 #服务器计费 #数据挖掘 #FP-增长 #算力建设 #硬件 #esb接口 #走处理类报异常 #飞牛NAS #监控 #NVR #EasyNVR #ffmpeg #CUDA #Triton #SSH密钥 # CUDA # ControlMaster #练习 #基础练习 #数组 #循环 #九九乘法表 #计算机实现 #dynadot #域名 #ETL管道 #向量存储 #数据预处理 #DocumentReader #PowerBI #企业 #smtp #smtp服务器 #PHP #银河麒麟部署 #银河麒麟部署文档 #银河麒麟linux #银河麒麟linux部署教程 #reactjs #web3 #昇腾300I DUO #链表的销毁 #链表的排序 #链表倒置 #判断链表是否有环 #Qwen3-14B # 大模型部署 # 私有化AI #AI技术 #vnstat #opencv #攻防演练 #Java web #红队 #AI 推理 #NV #文心一言 #AI智能体 #大剑师 #nodejs面试题 #vp9 #ServBay #ESP32 # OTA升级 # 黄山派 #飞牛nas #fnos #ansys #ansys问题解决办法 # WebUI # 网络延迟 #ranger #MySQL8.0 #SSH跳板机 # Python3.11 #WT-2026-0001 #QVD-2026-4572 #smartermail #LVDS #高速ADC #DDR #游戏机 #Modbus-TCP #screen命令 #Gunicorn #WSGI #Flask #并发模型 #容器化 #性能调优 #系统管理 #服务 #Emby #视频 #管道Pipe #system V #ai编程 #VMware Workstation16 #llama #ci/cd #门禁 #梯控 #智能一卡通 #门禁一卡通 #消费一卡通 #智能梯控 #一卡通 #elk #Socket网络编程 #超时设置 #客户端/服务器 #网络编程 #ShaderGraph #图形 #sql注入 #数据恢复 #视频恢复 #视频修复 #RAID5恢复 #流媒体服务器恢复 #muduo #TcpServer #accept #高并发服务器 #muduo库 #uv #uvx #uv pip #npx #Ruff #pytest # 服务器配置 # GPU #react native #AI-native #能源 #Gateway #认证服务器集成详解 #框架搭建 #状态模式 #dba #Tokio #中间件 #远程连接 #MQTT协议 #vivado license #CVE-2025-68143 #CVE-2025-68144 #CVE-2025-68145 #ue5 #html5 #WinSCP 下载安装教程 #SFTP #FTP工具 #服务器文件传输 #excel # 批量部署 #copilot # 批量管理 #ASR #SenseVoice #扩展屏应用开发 #android runtime # TTS服务器 # 键鼠锁定 #AI部署 # ms-swift #PN 结 #后端框架 #服务器线程 # SSL通信 # 动态结构体 #RWK35xx #语音流 #实时传输 #超算中心 #PBS #lsf #报表制作 #职场 #数据可视化 #信息可视化 #用数据讲故事 #语音生成 #TTS #IO #数据迁移 #JNI #pxe #lvs #adobe #STUN # TURN # NAT穿透 #MCP服务器注解 #异步支持 #方法筛选 #声明式编程 #自动筛选机制 #宝塔面板部署RustDesk #RustDesk远程控制手机 #手机远程控制 #系统安装 #铁路桥梁 #DIC技术 #箱梁试验 #裂纹监测 #四点弯曲 #可再生能源 #绿色算力 #风电 #麦克风权限 #访问麦克风并录制音频 #麦克风录制音频后在线播放 #用户拒绝访问麦克风权限怎么办 #uniapp 安卓 苹果ios #将音频保存本地或上传服务器 #Docker #express #cherry studio #gmssh #宝塔 #漏洞挖掘 #Exchange #free #vmstat #sar #sentinel #AI应用编程 # 自动化运维 #r语言 #若依 #TRO #TRO侵权 #TRO和解 #运维工具 #网络攻击模型 #Discord机器人 #云部署 #程序那些事 #自由表达演说平台 #演说 #程序人生 #移动端h5网页 #调用浏览器摄像头并拍照 #开启摄像头权限 #拍照后查看与上传服务器端 #摄像头黑屏打不开问题 #AI Agent #开发者工具 #企业微信 #服务器IO模型 #非阻塞轮询模型 #多任务并发模型 #异步信号模型 #多路复用模型 # 黑屏模式 #前端开发 #EN4FE #领域驱动 #Karalon #AI Test #流程图 #论文笔记 #图论 #国产开源制品管理工具 #Hadess #一文上手 #蓝桥杯 #串口服务器 #工业级串口服务器 #串口转以太网 #串口设备联网通讯模块 #串口服务器选型 #okhttp #IndexTTS2 # 阿里云安骑士 # 木马查杀 #范式 #计算机外设 #入侵 #日志排查 #Reactor #ET模式 #非阻塞 #remote-ssh #ARM服务器 # 多模态推理 #健康医疗 #AI应用 #CMake #Make #C/C++ #图像识别 #多进程 #python技巧 #高考 #视觉检测 #visual studio #iot #多模态 #微调 #超参 #LLamafactory #生信 #RK3576 #瑞芯微 #硬件设计 #工程实践 #策略模式 #租显卡 #训练推理 #gpt #API #taro #java大文件上传 #java大文件秒传 #java大文件上传下载 #java文件传输解决方案 #wps #Linux多线程 #ambari #bigtop #hdp #hue #kerberos #pencil #pencil.dev #设计 #Java程序员 #Java面试 #后端开发 #Spring源码 #Spring #SpringBoot #轻量化 #低配服务器 #Beidou #北斗 #SSR #Anything-LLM #IDC服务器 #私有化部署 #信息安全 #信息收集 #poll #c #PyCharm # 远程调试 # YOLOFuse #通信 #simulink #matlab #docker安装seata #gateway #传统行业 #Syslog #系统日志 #日志分析 #日志监控 #生产服务器问题查询 #日志过滤 #Autodl私有云 #深度服务器配置 # 水冷服务器 # 风冷服务器 # IndexTTS 2.0 #VoxCPM-1.5-TTS # 云端GPU # PyCharm宕机 #全链路优化 #实战教程 #pjsip #人脸识别sdk #视频编解码 #人脸识别 #VMware创建虚拟机 #远程更新 #缓存更新 #多指令适配 #物料关联计划 #AI生成 # outputs目录 # 自动化 #挖漏洞 #攻击溯源 #编程 #stl #漏洞修复 #IIS Crypto #blender #warp #SSH保活 #数字化转型 #实体经济 #商业模式 #软件开发 #数智红包 #商业变革 #创业干货 #微PE # GLM-4.6V-Flash-WEB # AI部署 #everything #材料工程 #智能电视 #AB包 #rabbitmq #m3u8 #HLS #移动端H5网页 #APP安卓苹果ios #监控画面 直播视频流 #Prometheus #决策树 #Zabbix #语音合成 #HistoryServer #Spark #YARN #jobhistory #DooTask #sglang #ComfyUI # 推理服务器 #防毒面罩 #防尘面罩 #n8n解惑 #编程助手 # 显卡驱动备份 #Socket #模拟退火算法 #计算机毕业设计 #程序定制 #毕设代做 #课设 #Hadoop #es安装 #SSH Agent Forwarding # 容器化 #高斯溅射 #UEFI #BIOS #Legacy BIOS #产品运营 #内存接口 # 澜起科技 # 服务器主板 # 服务器迁移 # 回滚方案 #大模型入门 #homelab #Lattepanda #Jellyfin #Plex #Kodi #yolov12 #研究生life #开关电源 #热敏电阻 #PTC热敏电阻 #文件传输 #电脑文件传输 #电脑传输文件 #电脑怎么传输文件到另一台电脑 #电脑传输文件到另一台电脑 #身体实验室 #健康认知重构 #系统思维 #微行动 #NEAT效应 #亚健康自救 #ICT人 #云开发 #eureka #性能 #优化 #RAM #KMS 激活 #mongodb #AI智能棋盘 #Rock Pi S #边缘计算 #wireshark #广播 #组播 #并发服务器 #nacos #银河麒麟aarch64 #uvicorn #uvloop #asgi #event #SSH别名 #BoringSSL #企业存储 #RustFS #对象存储 #高可用 #云计算运维 # keep-alive #asp.net上传大文件 #gpu #nvcc #cuda #nvidia #ceph #驱动开发 #TensorRT # 推理优化 #c++高并发 #百万并发 #Coturn #TURN #k8s #log4j #Jetty # 嵌入式服务器 #模块 #turn #ICE #群晖 #音乐 # ARM服务器 # 鲲鹏 #IntelliJ IDEA #Spring Boot #SQL注入主机 #neo4j #NoSQL #SQL #http头信息 #全文检索 #银河麒麟服务器系统 # 代理转发 # 跳板机 # HiChatBox # 离线AI #建筑缺陷 #红外 #数据集 #TCP服务器 #开发实战 #SMARC #ARM #汽车 #ThingsBoard MCP #可撤销IBE #服务器辅助 #私钥更新 #安全性证明 #双线性Diffie-Hellman # 公钥认证 #短剧 #短剧小程序 #短剧系统 #微剧 #空间计算 #原型模式 #hibernate #nosql #VibeVoice # 云服务器 #戴尔服务器 #戴尔730 #装系统 #OPCUA #Comate #I/O模型 #并发 #水平触发、边缘触发 #多路复用 #clickhouse #数据访问 #vncdotool #链接VNC服务器 #如何隐藏光标 # 服务器IP访问 # 端口映射 #磁盘配额 #存储管理 #形考作业 #国家开放大学 #系统运维 #自动化运维 #青少年编程 #DHCP #网络安全大赛 #C++ UA Server #SDK #跨平台开发 #r-tree #eclipse #servlet #arm64 #CNAS #CMA #程序文件 #SSH复用 # 远程开发 #wpf #实时检测 #卷积神经网络 #Modbus #MOXA #GATT服务器 #蓝牙低功耗 #googlecloud #lucene #DAG #云服务器选购 #Saas #线程 #机器视觉 #6D位姿 #UOS #海光K100 #统信 #CPU利用率 #outlook #错误代码2603 #无网络连接 #2603 #mssql #数据安全 #注入漏洞 #Fun-ASR # 语音识别 #HarmonyOS APP #密码 #firefox #safari # RTX 3090 #b树 #具身智能 #声源定位 #MUSIC #windbg分析蓝屏教程 #AI电商客服 #Aluminium #Google #spring ai #oauth2 #memory mcp #Cursor #网路编程 #nmodbus4类库使用教程 #docker-compose #目标跟踪 #rtmp #IFix # 高温监控 #c++20 # 远程连接 #fs7TF # 远程访问 # 服务器IP #Ubuntu服务器 #硬盘扩容 #命令行操作 #ROS # 局域网访问 # 批量处理 #内存治理 #安全架构 #gerrit #opc ua #opc #npu # 环境迁移 #matplotlib #TTS私有化 # IndexTTS # 音色克隆 #内网 #指针 #anaconda #虚拟环境 #远程软件 # GLM-TTS # 数据安全 #代理服务器 #rsync # 数据同步 #ip #设计师 #图像处理 #游戏美术 #技术美术 # 大模型推理 #分布式数据库 #集中式数据库 #业务需求 #选型误 # Connection refused #odoo # GLM # 服务连通性 #HarmonyOS #azure #Apple AI #Apple 人工智能 #FoundationModel #Summarize #SwiftUI #多线程 #claudeCode #content7 #源代码管理 #跳槽 #工作 #挖矿 #Linux病毒 #网安应急响应 # 高并发 # 串口服务器 # NPort5630 #appche #MS #Materials #华为od #华为机试 #OpenHarmony #Python办公自动化 #Python办公 #SSH跳转 # GPU集群 #服务器开启 TLS v1.2 #IISCrypto 使用教程 #TLS 协议配置 #IIS 安全设置 #服务器运维工具 #ftp #sftp #uniapp #合法域名校验出错 #服务器域名配置不生效 #request域名配置 #已经配置好了但还是报错 #uniapp微信小程序 #YOLO识别 #YOLO环境搭建Windows #YOLO环境搭建Ubuntu # 轻量化镜像 # 边缘计算 #国产化OS #opc模拟服务器 #cpu #套接字 #I/O多路复用 #字节序 #工程设计 #预混 #扩散 #燃烧知识 #层流 #湍流 #weston #x11 #x11显示服务器 #量子计算 #计算几何 #斜率 #方向归一化 #叉积 #samba #RSO #机器人操作系统 #硬盘克隆 #DiskGenius #glibc #数学建模 #2026年美赛C题代码 #2026年美赛 #反向代理 #VS Code调试配置 #智能制造 #供应链管理 #工业工程 #库存管理 #MinIO #WinDbg #Windows调试 #内存转储分析 #静脉曲张 #腿部健康 #运动 #agi #log #运维 #浏览器自动化 #python #claude code #code cli #ccusage #Ascend #MindIE #边缘AI # Kontron # SMARC-sAMX8 #Xshell #Finalshell #生物信息学 #组学 #SSH免密登录 #FRP #上下文工程 #langgraph #意图识别 #人大金仓 #Kingbase #OpenAI #故障 #WRF #WRFDA #gRPC #注册中心 #CA证书 #esp32 arduino #二值化 #Canny边缘检测 #轮廓检测 #透视变换 #nas #测速 #iperf #iperf3 #交换机 #三层交换机 # REST API #面向对象 #基础语法 #标识符 #常量与变量 #数据类型 #运算符与表达式 #session # 权限修复 #主板 #总体设计 #电源树 #框图 # 端口7860 #iphone #模版 #函数 #类 #笔试 #junit #WEB #阿里云RDS #diskinfo # 磁盘健康 #流量监控 #coffeescript # 自动化部署 # VibeThinker #le audio #低功耗音频 #连接 #Buck #NVIDIA #算力 #交错并联 #DGX #GB28181 #SIP信令 #视频监控 #xshell #host key #模型上下文协议 #MultiServerMCPC #load_mcp_tools #load_mcp_prompt #雨云服务器 #教程 #MCSM面板 #文生视频 #WAN2.2 #AI视频生成 #Ubuntu #游戏策划 #游戏程序 #用户体验 #TLS协议 #HTTPS #运维安全 #mtgsig #美团医药 #美团医药mtgsig #美团医药mtgsig1.2