浪潮君 的学生作业:
#include // 标准输入输出函数,如 printf、perror
#include // 标准库函数,如 malloc、exit
#include // 字符串处理函数,如 memset
#include // UNIX 系统调用,如 close
#include // 提供网络字节序、地址转换函数
#include // 提供 socket、bind、listen 等 API
// =======================================================================
// 函数名称:tcp_socket_create
// 函数功能:封装 TCP 服务端 socket 的创建、绑定和监听过程
// 输入参数:
// ip —— 要绑定的 IP 字符串,如 “0.0.0.0”
// port —— 要监听的端口号,如 8888
// backlog —— 最大等待连接队列长度
// 返回值:成功返回监听 socket 文件描述符;失败返回 -1 并打印错误信息
// =======================================================================
int tcp_socket_create(const char *ip, int port, int backlog) {
int sockfd;
struct sockaddr_in addr;
// 1. 创建 TCP socket(使用 IPv4 + 面向连接)
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket 创建失败");
return -1;
}
// 2. 设置 socket 选项 —— 允许端口复用(防止 TIME_WAIT 占用)
int opt = 1;
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
perror("setsockopt 设置失败");
close(sockfd);
return -1;
}
// 3. 清零地址结构体,并配置 IP + 端口 + 协议族
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET; // IPv4
addr.sin_port = htons(port); // 主机字节序 → 网络字节序
// 将字符串形式的 IP 转换为网络地址结构(支持 127.0.0.1, 0.0.0.0 等)
if (inet_pton(AF_INET, ip, &addr.sin_addr)