C语言多进程TCP服务器示例:epoll与Fork并发架构
本文提供了一个完整的C语言多进程TCP服务器示例代码。通过结合epoll IO多路复用技术与fork()多进程机制,实现高效的并发处理能力。代码涵盖了服务端初始化、连接接受、业务逻辑处理等关键模块。
项目结构与依赖
本示例采用模块化设计,主要包含两个头文件和对应的实现文件,编译时需统一链接:
- server.h/server.c:负责Socket服务建立、Epoll事件监听及进程管理。
- bussiness.h/bussiness.c:负责具体的客户端读写及业务逻辑(当前为打印回显)。
第1步:配置全局参数与服务端基础设置
在 server.h 中定义了一系列宏常量,用于灵活调整服务行为:
DEF_PORT 6000:默认监听端口。MAX_EPOLL_SIZE 10:一次epoll_wait可返回的最大事件数。DEF_PROCESS_NUM 5:初始创建的服务进程数量。
create_tcpsvr函数负责创建Socket、绑定地址并进入监听状态,使用htons转换端口字节序,确保跨平台正确性。
第2步:初始化Epoll与事件分发逻辑
init_epoll创建一个非阻塞的epollfd,并将监听套接字(listenfd)以EPOLLIN事件注册其中。
在 comm_to_clt 主循环中,程序调用epoll_wait等待事件。若检测到新连接,则进入 epoll_business 处理分支:
- 接受连接获取客户端文件描述符
clt_fd。 - 设置
fcntl(clt_fd, F_SETFL, O_NONBLOCK)将客户端socket设为非阻塞。 - 将该socket添加至Epoll监听池,事件类型设置为
EPOLLIN|EPOLLET(边缘触发),以提升处理效率。
第3步:构建多进程并发模型
为避免僵尸进程,主进程通过 signal(SIGCHLD,SIG_IGN) 忽略子进程结束信号。
create_process 函数循环执行 fork(),根据 DEF_PROCESS_NUM 创建指定数量的子进程。每个子进程继承父进程的监听Socket并独立运行 comm_to_clt 循环,从而实现对客户端连接的负载均衡。主进程最后进入睡眠等待。
第4步:实现业务读写接口
bussiness.c 提供了基础的读写封装:
- read_sock 和 write_sock 分别封装系统调用,并在出错时打印错误信息。
- main_service 为具体业务入口,目前仅将接收到的数据进行打印输出(printf)。在实际应用中,此处应替换为具体的数据解析或响应生成逻辑。
编译与运行方法
将所有源代码放置在同一目录下,使用GCC进行编译。由于涉及多线程/进程管理及网络编程,需链接标准库:
gcc -o tcp_server server.c bussiness.c
启动后可使用Telnet或Netcat工具连接测试:
nc localhost 6000
排错与建议
- 内存泄漏风险:上述代码中,每次处理完一个连接都会调用
close(ev.data.fd)关闭Socket,这是正确的做法。但在实际复杂场景中,请确保所有动态分配的内存均已释放。 - ET模式陷阱:Epoll使用边缘触发(ET)模式时,必须确保在一次事件中读完所有可用数据,否则可能导致后续数据丢失。当前示例较为简单,建议在真实场景中加入循环读取直到EAGAIN的逻辑。
- 孤儿进程:虽然使用了
SIG_IGN忽略SIGCHLD,但在某些特殊退出场景下,建议增加waitpid(-1, NULL, WNOHANG)调用以确保资源回收。
总结
该示例展示了Linux环境下高性能网络服务的基础构建方式。通过Epoll减少上下文切换开销,配合多进程提升吞吐量。以上就是C语言多进程TCP服务器实现的详细内容,更多关于高性能服务器开发的相关资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













