网络编程代码实例:守护进程版

前言

网络编程代码实例:守护进程版。


代码仓库


内容

  • 使用传输控制协议(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

代码

由于代码篇幅较多,在博客中直接粘贴并呈现会显得冗长,因此未在博客中放置代码。请前往"代码仓库"查看或获取相关代码。


结果

操作时序:

  1. make clean:清理文件
  2. make all:生成文件
  3. cd bin:切换到二进制文件目录
  4. ./server: 启动服务端
  5. ps -ef | grep -w “./server” | grep -v grep:查看服务端进程(服务端父进程9949作为后台守护进程启动;此时无客户端连接,所以无服务端子进程)
  6. ./client_select:启动客户端client_select,发送消息"client_select"
  7. ./client_client_poll:启动客户端client_poll,发送消息"client_poll"
  8. ./client_epoll:启动client_epoll,发送消息"client_epoll"
  9. Ctrl+C:使客户端client_select异常终止
  10. Ctrl+D:使客户端client_poll正常终止
  11. kill 9949:终止服务端父进程9949
  12. ps -ef | grep -w “./server” | grep -v grep:查看服务端进程(服务端父进程9949终止;服务端子进程10241仍与客户端client_epoll连接)
  13. 客户端client_epoll,发送消息"client_epoll2",能够正常通信
  14. 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

作者的话

  • 感谢参考资料的作者/博主
  • 作者:夜悊
  • 版权所有,转载请注明出处,谢谢~
  • 如果文章对你有帮助,请点个赞或加个粉丝吧,你的支持就是作者的动力~
  • 文章在描述时有疑惑的地方,请留言,定会一一耐心讨论、解答
  • 文章在认识上有错误的地方, 敬请批评指正
  • 望读者们都能有所收获

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值