并发服务器编程

本文介绍了并发服务器编程,包括长连接和短连接的概念,同步和异步处理方式。重点关注并发服务器编程注意事项,如防止子进程变成僵尸进程的策略,以及并发服务器文件描述符的变化。最后,给出了TCP并发服务器的代码实现,包括处理流程、报文协议说明和服务器、客户端代码示例。
摘要由CSDN通过智能技术生成
 

并发服务器是socket应用编程中最常见的应用模型。并发服务器模型根据连接方式分为长连接和短连接,长连接为通信双方建立连接后一直保持连接,然后一直用此连接进行读写操作;短连接为通信双方每一次交易过程都建立连接和关闭连接。并发服务器模型根据处理方式可分为同步方式和异步方式,同步是客户端发送请求给服务器等待服务器返回处理结果;异步是指客户端发送请求给服务器,不等待服务器返回处理结果,而直接去完成其他的流程,对于处理结果客户端可以事后查询和让服务器进行主动通知。

1.   并发服务器编程注意事项

进程是一个程序的一次运行过程,它是一个动态实体,是独立的任务,它拥有独立的地址空间、执行堆栈、文件描述符等。每个进程拥有独立的地址空间,在进程不存在父子关系的情况下,互不影响。

进程的终止存在两个可能:父进程先于子进程终止(由init进程领养),子进程先于主进程终止。对于后者,系统内核为子进程保留一定的状态信息(进程ID、终止状态、CPU时间等),并向其父进程发送SIGCHLD信号。当父进程调用wait或waitpid函数时,将获取这些信息,获取后内核将对僵尸进程进行清理。如果父进程设置了忽略SIGCHLD信号或对SIGCHLD信号提供了处理函数,即使不调用wait或waitpid函数内核也会清理僵尸进程。

但父进程调用wait函数处理子进程退出信息时,会存在下面所述的问题。在有多个子进程情况下,wait函数只等待最先到达的子进程的终止信息。下图18-7父进程有3个子进程,由于SIGCHLD信号不排队,在SIGCHLD信号同时到来后,父进程的wait函数只执行一次,这样将留下2个僵尸进程,而使用waitpid函数并设置WNOHANG选项可以解决这个问题。

图18-7 多进程信号图

综上所述,在多进程并发的情况下,防止子进程变成僵尸进程常见有如下两种方法:

①    父进程调用signal(SIGCHLD,SIG_IGN)对子进程退出信号进行忽略,或者把SIG_IGN替换为其他处理函数,设置对SIGCHLD信号的处理。

②    父进程调用waitpid(-1,NULL,WNOHANG)对所有子进程SIGCHLD信号进行处理。

2.   并发服务器文件描述符变化图

图18-8~图18-11画出了并发服务器文件描述符的变化流程图。其中listenfd为服务端的socket监听文件描述符,connfd为accept函数返回的socket连接文件描述符。

服务器调用accept函数后,客户与服务器文件描述符如下图18-8所示。

图18-8 调用accept函数时套接字描述符图

 

服务器调用accept函数后,客户与服务器文件描述符如下图18-9所示。

 

图18-9调用accept函数后套接字描述符图

 

服务器调用fork函数后,客户与服务器文件描述符如下图18-10所示。

 

图18-10调用fork函数后套接字描述符图

 

服务端父进程关闭连接套接字,子进程关闭监听套接字,客户与服务器文件描述符状况如下图18-11所示。

 

图18-11 并发服务器最终连接图

在这里强调的是,并发服务器fork后父进程一定要关闭子进程连接套接字;而子进程要关闭父进程监听套接字,以免误操作。

1.   TCP并发服务器代码实现

(1)并发服务器处理流程

    并发服务器处理流程如下:

①    客户端首先发起连接。

②    服务端进程accept打开一个新的连接套接字与客户端进行连接,accept在一个while(1)循环内等待客户端的连接。

③    服务端fork一个子进程,同时父进程close子进程连接套接字,循环等待下一进程。

④    服务

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值