UNP第五章描述了在客户端和服务器连接建立之后会出现的几种情况,并给出了解决方案,做一个简单的总结。

先给出这个简单的回射C/S程序的模型如下图。

 

1、客户端和服务器正常终止连接

客户端从标准输入键入EOF便可以正常终止客户端程序,此间发生了几件事。

  • 客户TCP向服务器TCP发送FIN,服务器TCP向客户TCP回送ACK。
  • 客户程序调用exit终止,内核关闭客户程序打开的套接口。
  • 服务器TCP收到FIN后,子程序调用exit终止,内核关闭子程序打开的描述字。
  • 子进程终止时向父进程发送SIGCHLD信号。
  • 服务器TCP向客户TCP发送FIN,客户TCP回送ACK。此时连接完全终止。

如果子进程发送的SIGCHLD信号被父进程忽略(即无信号处理函数),那么子进程将进入僵死状态,即僵尸进程(僵尸进程存在的目的是维护子进程的信息,以便父进程在以后某个时候获取)。为了解决这个问题,必须捕捉这个信号并将进程wait或waitpid掉(关于信号处理将在另一篇文章中介绍)。

 

2、服务器进程终止

如果服务器的进程被杀死,此时会出现这么几件事:

  • 服务器TCP发送FIN给客户TCP,客户TCP回送ACK。
  • 如果此时客户端再给服务器发送数据(服务器TCP发送FIN来向客户TCP表明关闭连接,而客户TCP并不知道此时的服务器进程已经终止了),会受到服务器TCP发送的RST(因此此时套接口进程已经终止了)。
  • 对于服务器TCP发送来的RST,客户不会看到(原因是,客户程序在发送数据之后调用readline会马上返回,继而阻塞在fgets上(标准输入),那么套接口的信息便被忽略了)。

问题所在:程序只在用户输入时候阻塞,而实际上套接口也需要阻塞,否则必然会有信息被忽略。这个问题将调用select和poll函数来解决。

 

3、服务器主机崩溃

当服务器意外崩溃时(相当于被人拔了网线),客户端不会得到任何的通知,于是客户端TCP会不断地重传数据,直到超时。如果想在客户不主动发送数据的情况下,也不需要等待超时时间而知道服务器崩溃的消息,那么需要设置SO_KEEPALIVE套接口选项。

 

4、服务器主机崩溃后重启

当前种情况下服务器重启,重启之后的服务器已经丢失了之前的所有连接,因此对客户端发送来的数据只会回送RST,这将导致客户端返回。

Unix网络编程(3)——C/S模型几种情况的更多相关文章

  1. UNIX网络编程——关于socket阻塞与非阻塞情况下的recv、send、read、write返回值

    1.阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有 区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回 ...

  2. Unix网络编程中的五种I/O模型_转

    转自:Unix网络编程中的的五种I/O模型 下面主要是把unp第六章介绍的五种I/O模型. 1. 阻塞I/O模型 例如UDP函数recvfrom的内核到应用层.应用层到内核的调用过程是这样的:首先把描 ...

  3. UNIX网络编程——网络I/O模型

    在学习UNIX网络编程的时候.一開始分不清 同步 和 异步,所以还是总结一下,理清下他们的差别比較好. IO分类 IO依据对IO的调度方式可分为堵塞IO.非堵塞IO.IO复用.信号驱动IO.异步IO. ...

  4. [转载] 读《UNIX网络编程 卷1:套接字联网API》

    原文: http://cstdlib.com/tech/2014/10/09/read-unix-network-programming-1/ 文章写的很清楚, 适合初学者 最近看了<UNIX网 ...

  5. 记录一次配置unix网络编程环境的过程和遇到的问题

    记录一次搭建unix网络编程环境过程中遇到的问题和总结 计算机环境虚拟机 linuxmint-18-xfce-64bit 1.打开unix网络编程.iso 把目录下的文件复制到某一目录,修改权限,可命 ...

  6. UNIX网络编程---简介

    UNIX网络编程---简介 一.           概述 a)       在编写与计算机通信的程序时,首先要确定的就是和计算机通信的协议,从高层次来确定通信由哪个程序发起以及响应在合适产生.大多数 ...

  7. UNIX网络编程——epoll 的accept , read, write(重要)

    在一个非阻塞的socket上调用read/write函数,返回EAGAIN或者EWOULDBLOCK(注:EAGAIN就是EWOULDBLOCK). 从字面上看,意思是: EAGAIN: 再试一次 E ...

  8. UNIX网络编程——客户/服务器程序设计示范(总结)

    (1)当系统负载较轻是,每来一个客户请求现场派生一个子进程为之服务的传统并发服务器程序模型就足够了.这个模型甚至可以与inetd结合使用,也就是inetd处理每个连接的接收.我们的其他意见是就重负荷运 ...

  9. 【unix网络编程第三版】阅读笔记(五):I/O复用:select和poll函数

    本博文主要针对UNP一书中的第六章内容来聊聊I/O复用技术以及其在网络编程中的实现 1. I/O复用技术 I/O多路复用是指内核一旦发现进程指定的一个或者多个I/O条件准备就绪,它就通知该进程.I/O ...

随机推荐

  1. POJ 3630- Phone List(Trie)

    题意:给一组串,是否存在一个串是另一个的前缀. 分析:val[N]保存树节点上是否组成一个串 #include <map> #include <set> #include &l ...

  2. CUDA网格限制

    如图

  3. 谈谈Nginx有哪些特点

    1.热部署        我个人觉得这个很不错.在master管理进程与worker工作进程的分离设计,使的Nginx具有热部署的功能,那么在7×24小时不间断服务的前提下,升级Nginx的可执行文件 ...

  4. return遇到finally

    public class Test { public static void main(String[] args) { System.out.println("=============t ...

  5. 使用slf4j取代Apache Commons Logging

    假如你正在开发应用程序所调用的组件当中已经使用了 JCL(之前叫 Jakarta Commons Logging,JCL) 的,还有一些组建可能直接调用了 java.util.logging,这时你需 ...

  6. IOS上的字符编码

    IOS字符编码 字符编码经常能听到的有Unicode.UTF-8.GBK.GB2312.GB18030.BIG5等.这些编码方式都有什么区别呢? 其实这些编码,大体分两类:全球统一编码和各过个语种的独 ...

  7. Ubuntu下部署SVN+SVNManager

    本文参考了一下博客,特此感谢: 灰烬之灵    一米阳光做IT.测试 环境描述:ubuntu 13.04 1.先创建svn组和svn用户: sudo addgroup svnsudo useradd ...

  8. 声明了包的类Java命令找不到或无法加载主类

    首先你需要配置环境变量: CLASSPATH=.;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar java 命令会在 CLASSPATH 目录下找相应 ...

  9. STM32硬件调试详解

    STM32的基本系统主要涉及下面几个部分: 一.电源 1).无论是否使用模拟部分和AD部分,MCU外围出去VCC和GND,VDDA.VSSA.Vref(如果封装有该引脚)都必需要连接,不可悬空: 2) ...

  10. C++学习笔记(八):函数重载、函数指针和函数对象

    函数重载 函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数.重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于 ...