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

文章目录

  • 前言
  • 代码仓库
  • 内容
  • 目录结构
  • 代码
  • 结果
  • 总结
  • 参考资料
  • 作者的话

前言

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


代码仓库

  • 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

代码

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


结果

操作时序:

  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:

网络编程代码实例:守护进程版_第1张图片
client_select:

网络编程代码实例:守护进程版_第2张图片
client_poll:

网络编程代码实例:守护进程版_第3张图片

client_epoll:

网络编程代码实例:守护进程版_第4张图片

log.txt:

网络编程代码实例:守护进程版_第5张图片


总结

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


参考资料

  • 《UNIX环境高级编程(第3版)》作者:W.Richard Stevens,Stephen A.Rago
  • 《UNIX网络编程(第3版)》作者:W.Richard Stevens,Bill Fenner,Andrew M.Rudoff

作者的话

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

你可能感兴趣的:(环境和网络编程,网络协议,网络,信息与通信,tcp/ip,c语言)