C++ 网络编程基础:Socket API 与 TCP 通信

围绕 Socket API 与 TCP/UDP 通信的核心概念、函数对照、示例代码与常见坑。 核心概念速查 概念 说明 关键点 Socket 网络通信端点 文件描述符抽象 TCP 面向连接、可靠 三次握手、四次挥手 UDP 无连接、不可靠 快速、轻量 sockaddr 通用地址结构 IPv4/IPv6 统一接口 字节序 大端/小端转换 htons() htonl() TCP 三次握手与四次挥手 三次握手(建立连接): Client ──SYN────▶ Server Client ◀─SYN+Ack─ Server Client ──Ack────▶ Server 四次挥手(关闭连接): Client ──FIN────▶ Server Client ◀─Ack───── Server Client ◀─FIN───── Server Client ──Ack────▶ Server TCP 客户端-服务器模型 服务器: socket() → bind() → listen() → accept() → recv/send → close() 客户端: socket() → connect() → send/recv → close() 核心函数对照表 函数 用途 参数要点 socket() 创建套接字 AF_INET, SOCK_STREAM, 0 bind() 绑定地址 套接字 + sockaddr_in listen() 监听连接 backlog 队列长度 accept() 接受连接 返回新套接字描述符 connect() 发起连接 服务器地址 send/recv() 发送/接收数据 缓冲区 + 长度 htons/htonl() 主机→网络字节序 short/long ntohs/ntohl() 网络→主机字节序 short/long 从 Qt 到原生 Socket Qt 写法 原生等价物 差异要点 server.listen(QHostAddress::Any, 8080) socket() + bind() + listen() 三步 Qt 一行帮你做三件事 newConnection 信号 → nextPendingConnection() accept() Qt 信号通知;原生阻塞死等 socket->connectToHost("ip", port) inet_pton() + connect() IP 解析要自己做 socket->write(bytes) send(fd, buf, len, 0) 返回值要检查,可能只发一半 readyRead 信号 → readAll() recv(fd, buf, size, 0) 没有"就绪通知",直接阻塞读 errorOccurred / stateChanged 检查返回值 + errno 错误要手动判断 QUdpSocket::writeDatagram/readDatagram sendto()/recvfrom() 多一个对端地址参数 QHostAddress("127.0.0.1") sockaddr_in + inet_pton() 字符串 IP 手动转结构体 端口字节序自动处理 必须自己 htons() Qt 内部帮你转了 核心差异:Qt 信号槽背后是「事件循环 + 就绪通知」(reactor 模式)。原生编程没有这个循环——要么阻塞死等,要么用线程,要么用 select/epoll 自己搭事件循环。学原生网络的本质,就是把 Qt 隐藏的三件事(fd 管理、字节序、事件分发)亲手做一遍。 ...

2026 年 10 月 13 日