TCP Socket 网络编程详解
本文详细讲解 TCP Socket 网络编程的核心 API,包括 socket、bind、listen、accept 和 connect 的用法。内容涵盖 TCP 三次握手与四次挥手原理、客户端与服务端代码实现、单进程及多进程/多线程模型对比,以及线程池的应用。此外,还介绍了守护进程的创建步骤、信号处理(如 SIGPIPE)及标准输出重定向,帮助开发者构建稳定运行的后台网络服务。
Socket 类型与参数
套接字域 (Domain)
第一个参数指定协议家族,例如 AF_INET 表示 IPv4,AF_INET6 表示 IPv6,AF_UNIX 表示本地通信。
套接字类型 (Type)
第二个参数定义套接字类型:
SOCK_STREAM: 面向字节流,对应 TCP。SOCK_DGRAM: 面向用户数据报,对应 UDP。
协议 (Protocol)
第三个参数通常填 0,系统会根据前两个参数自动选择默认协议。
TCP Socket API 详解
以下函数都在 <sys/socket.h> 中定义。
socket()
打开一个网络通讯端口。如果成功,返回文件描述符;如果出错,返回 -1。
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
对于 IPv4,family 参数指定为 AF_INET;对于 TCP 协议,type 参数指定为 SOCK_STREAM。
bind()
服务器程序需要调用 bind 绑定固定的网络地址和端口号。
struct sockaddr_in local;
memset(&local, 0, sizeof(local));
local.sin_family = AF_INET;
local.sin_port = htons(port_);
inet_aton(ip_.c_str(), &(local.sin_addr));
bind(sockfd_, (struct sockaddr *)(&local), sizeof(local));
- 将 sockfd 和 myaddr 绑定在一起。
- 成功返回 0,失败返回 -1。
- 注意:云服务器公网 IP 通常不能直接绑定,一般绑定
0.0.0.0或内网 IP。
listen()
声明 sockfd 处于监听状态,并设置等待队列长度 backlog。
listen(sockfd_, backlog);
- 最多允许 backlog 个客户端处于连接等待状态。
- 成功返回 0,失败返回 -1。


