CppGuide社区 CppGuide社区
首页
  • 🔥最新谷歌C++风格指南(含C++17/20)
  • 🔥C++17详解
  • 🔥C++20完全指南
  • 🔥C++23快速入门
🔥C++面试
  • 第1章 C++ 惯用法与Modern C++篇
  • 第2章 C++开发工具与调试进阶
  • 第3章 C++多线程编程从入门到进阶
  • 第4章 C++网络编程重难点解析
  • 第5章 网络通信故障排查常用命令
  • 第6章 网络通信协议设计
  • 第7章 高性能服务结构设计
  • 第8章 Redis网络通信模块源码分析
  • 第9章 服务其他模块设计
  • 🚀 全部章节.pdf 下载 (opens new window)
  • 🔥C++游戏编程入门(零基础学C++)
  • 🔥使用C++17从零开发一个调试器 (opens new window)
  • 🔥使用C++20从零构建一个完整的低延迟交易系统 (opens new window)
  • 🔥使用C++从零写一个C语言编译器 (opens new window)
  • 🔥从零用C语言写一个Redis
  • leveldb源码分析
  • libevent源码分析
  • Memcached源码分析
  • TeamTalk源码分析
  • 优质源码分享 (opens new window)
  • 🔥远程控制软件gh0st源码分析
  • 🔥Windows 10系统编程
  • 🔥Linux 5.x内核开发与调试 完全指南 (opens new window)
  • TCP源码实现超详细注释版.pdf (opens new window)
  • 高效Go并发编程
  • Go性能调优
  • Go项目架构设计
  • 🔥使用Go从零开发一个数据库
  • 🔥使用Go从零开发一个编译器 (opens new window)
  • 🔥使用Go从零开发一个解释器 (opens new window)
Rust编程指南
  • SQL零基础指南
  • MySQL开发与调试指南
GitHub (opens new window)
首页
  • 🔥最新谷歌C++风格指南(含C++17/20)
  • 🔥C++17详解
  • 🔥C++20完全指南
  • 🔥C++23快速入门
🔥C++面试
  • 第1章 C++ 惯用法与Modern C++篇
  • 第2章 C++开发工具与调试进阶
  • 第3章 C++多线程编程从入门到进阶
  • 第4章 C++网络编程重难点解析
  • 第5章 网络通信故障排查常用命令
  • 第6章 网络通信协议设计
  • 第7章 高性能服务结构设计
  • 第8章 Redis网络通信模块源码分析
  • 第9章 服务其他模块设计
  • 🚀 全部章节.pdf 下载 (opens new window)
  • 🔥C++游戏编程入门(零基础学C++)
  • 🔥使用C++17从零开发一个调试器 (opens new window)
  • 🔥使用C++20从零构建一个完整的低延迟交易系统 (opens new window)
  • 🔥使用C++从零写一个C语言编译器 (opens new window)
  • 🔥从零用C语言写一个Redis
  • leveldb源码分析
  • libevent源码分析
  • Memcached源码分析
  • TeamTalk源码分析
  • 优质源码分享 (opens new window)
  • 🔥远程控制软件gh0st源码分析
  • 🔥Windows 10系统编程
  • 🔥Linux 5.x内核开发与调试 完全指南 (opens new window)
  • TCP源码实现超详细注释版.pdf (opens new window)
  • 高效Go并发编程
  • Go性能调优
  • Go项目架构设计
  • 🔥使用Go从零开发一个数据库
  • 🔥使用Go从零开发一个编译器 (opens new window)
  • 🔥使用Go从零开发一个解释器 (opens new window)
Rust编程指南
  • SQL零基础指南
  • MySQL开发与调试指南
GitHub (opens new window)
  • 从零用C语言写一个Redis 引言
  • 02. 套接字入门
    • 02. 套接字入门
  • 03. 简易服务器/客户端
  • 04. 协议解析
  • 05. 事件循环与非阻塞I/O
  • 06. 事件循环的实现
  • 07. 基础服务器:实现get、set、del功能
  • 08. 数据结构:哈希表
  • 09. 数据序列化
  • 10. AVL树:实现与测试
  • 11. AVL树和有序集合
  • 12. 事件循环和定时器
  • 13. 堆数据结构和生存时间(TTL)
  • 14. 线程池与异步任务
目录

02. 套接字入门

# 02. 套接字入门

这一章节是来给你介绍套接字编程的。咱们假设看这本书的小伙伴都有点计算机网络的基础知识,但在网络编程这块儿还没什么实战经验哈。这本书可不会把套接字API的所有细节都讲一遍,建议你在看这本书的同时,也去翻翻手册,再参考参考其他网络编程指南。

Redis就是一个典型的服务器/客户端系统。好多客户端都能连到同一个服务器上,服务器会接收TCP连接发来的请求,然后再把响应发回去。在开始套接字编程之前,咱们得先学几个Linux系统调用。

socket()系统调用会返回一个文件描述符(fd,file descriptor)。要是你不太熟悉Unix系统,我给你简单解释一下“fd”是啥:fd就是个整数,在Linux内核里,它就像是个“小标签”,能指向好多东西呢,比如一个TCP连接、一个磁盘文件、一个监听端口,或者其他的一些资源等等。

bind()和listen()这两个系统调用也很重要:bind()的作用就是把一个地址和套接字fd关联起来,而listen()能让咱们接收发到这个地址的连接。

accept()这个系统调用会接收一个监听的fd。当有客户端连接到监听地址时,accept()就会返回一个fd,这个fd代表的就是连接套接字啦。下面这段伪代码展示了服务器的典型工作流程:

fd =  socket()
bind(fd, address)
listen(fd)
while  True :
    conn_fd =  accept(fd)
    do_something_with(conn_fd)
    close(conn_fd)
1
2
3
4
5
6
7

read()系统调用用来从TCP连接接收数据,write()系统调用则是用来发送数据的。close()系统调用会销毁fd指向的资源,还能把fd这个编号回收再利用。

咱们已经介绍了服务器端网络编程需要用到的系统调用。客户端这边呢,connect()系统调用会接收一个套接字fd和地址,然后建立到这个地址的TCP连接。下面是客户端的伪代码:

fd =  socket()
connect(fd, address)
do_something_with(fd)
close(fd)
1
2
3
4

下一章会用真正的代码,带你开启实战之旅!

上次更新: 2025/03/25, 00:48:42
从零用C语言写一个Redis 引言
03. 简易服务器/客户端

← 从零用C语言写一个Redis 引言 03. 简易服务器/客户端→

最近更新
01
C++语言面试问题集锦 目录与说明
03-27
02
第四章 Lambda函数
03-27
03
第二章 关键字static及其不同用法
03-27
更多文章>
Copyright © 2024-2025 沪ICP备2023015129号 张小方 版权所有
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式