文章目录
- 前言
- 代码仓库
- 内容
- 目录结构
- 代码
- 结果
- 总结
- 参考资料
- 作者的话
前言
网络编程代码实例:守护进程版。
代码仓库
- yezhening/Environment-and-network-programming-examples: 环境和网络编程实例 (github.com)
- Environment-and-network-programming-examples: 环境和网络编程实例 (gitee.com)
内容
- 使用传输控制协议(TCP)
- 检测recv()返回值,遇到信号或网络中断会重启
- 为保证代码简洁,部分输入输出和字符串处理函数未获取返回值进行错误检测
- 服务端作为守护进程启动,设置无缓冲IO,标准输入、输出和错误重定向并实时记录到日志文本文件。在main()开头注释不调用create_daemon(),可不作为守护进程启动——增加
- 服务端使用signal()注册SIGCHLD信号处理函数(signal()函数对信号处理一次后,信号恢复默认行为,需要在信号处理函数中重新注册)。信号处理函数中使用可重入函数和保存并恢复旧errno方案,避免重入错误。父进程接收SIGCHLD信号后调用循环非阻塞waitpid()可处理同时终止的多个子进程,避免子进程成为僵尸进程——增加
- 服务端检测accept()慢系统调用的返回值,遇到信号中断会重启。在三次握手后且accept()返回前的时序,收到客户端RST重新连接,依据POSIX标准重启——增加
- 服务端设置套接字选项:SO_KEEPLIVE。客户端不发送数据也可以检测到服务端主机崩溃、主机崩溃后重启或网络不可达——增加
- 服务端设置套接字选项:SO_REUSEADDR。服务端Ctrl+C或意外中止后,不会经过TIME_WAIT状态,bind()不会报错:Address already in use,可立即重启服务端。连接套接字子进程正常运行,监听套接字父进程可立即重启。允许多个IP地址绑定同一个端口——增加
- 服务端多进程,一个服务端可并发连接多个客户端
- 服务端使用getpeername()而不是传递客户端sockaddr_in{}参数获取客户端地址——修改
- 用户在客户端终端输入,可多次手动通信
- 3个客户端代码实例分别使用IO复用的select、poll和epoll技术,同时监听用户输入和网络接收,可即时检测到服务端进程终止和服务端主机关机
- Makefile文件增加注释和生成.o目标文件逻辑——增加
目录结构
daemon_process/:
- bin/
- obj/
- src/
- log.txt:以守护进程方式(未注释main()中的creat_daemon()),运行daemon_process/bin/server生成
- Makefile
daemon_process/bin/:运行Makefile生成
- client_epoll
- client_poll
- client_select
- server
daemon_process/obj/:运行Makefile生成
- client_epoll.o
- client_poll.o
- client_select.o
- server.o
daemon_process/src/:
- client_epoll.c
- client_poll.c
- client_select.c
- server.c
代码
由于代码篇幅较多,在博客中直接粘贴并呈现会显得冗长,因此未在博客中放置代码。请前往"代码仓库"查看或获取相关代码。
结果
操作时序:
- make clean:清理文件
- make all:生成文件
- cd bin:切换到二进制文件目录
- ./server: 启动服务端
- ps -ef | grep -w “./server” | grep -v grep:查看服务端进程(服务端父进程9949作为后台守护进程启动;此时无客户端连接,所以无服务端子进程)
- ./client_select:启动客户端client_select,发送消息"client_select"
- ./client_client_poll:启动客户端client_poll,发送消息"client_poll"
- ./client_epoll:启动client_epoll,发送消息"client_epoll"
- Ctrl+C:使客户端client_select异常终止
- Ctrl+D:使客户端client_poll正常终止
- kill 9949:终止服务端父进程9949
- ps -ef | grep -w “./server” | grep -v grep:查看服务端进程(服务端父进程9949终止;服务端子进程10241仍与客户端client_epoll连接)
- 客户端client_epoll,发送消息"client_epoll2",能够正常通信
- kill 10241:终止服务端子进程10241,客户端client_epoll被迫终止
server:
client_select:
client_poll:
client_epoll:
log.txt:
总结
网络编程代码实例:守护进程版。
参考资料
- 《UNIX环境高级编程(第3版)》作者:W.Richard Stevens,Stephen A.Rago
- 《UNIX网络编程(第3版)》作者:W.Richard Stevens,Bill Fenner,Andrew M.Rudoff
作者的话
- 感谢参考资料的作者/博主
- 作者:夜悊
- 版权所有,转载请注明出处,谢谢~
- 如果文章对你有帮助,请点个赞或加个粉丝吧,你的支持就是作者的动力~
- 文章在描述时有疑惑的地方,请留言,定会一一耐心讨论、解答
- 文章在认识上有错误的地方, 敬请批评指正
- 望读者们都能有所收获