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. 《深入Java虚拟机学习笔记》- 第9章 垃圾收集

    一.Java内存组成 组成图 堆(Heap) 运行时数据区域,所有类实例和数组的内存均从此处分配.Java虚拟机启动时创建.对象的堆内存由称为垃圾回收器的自动内存管理系统回收. 组成 组成 详解 Yo ...

  2. Month Calendar

    http://www.codeproject.com/Articles/10840/Another-Month-Calendar#xx4614180xx Another Month Calendar ...

  3. ZOJ 3469 Food Delivery 区间DP

    这道题我不会,看了网上的题解才会的,涨了姿势,现阶段还是感觉区间DP比较难,主要是太弱...QAQ 思路中其实有贪心的意思,n个住户加一个商店,分布在一维直线上,应该是从商店开始,先向两边距离近的送, ...

  4. C#发送简单的HTTP POST请求给传统的ASP网页。

    设计思路 创建HTTPWebRequest类的一个实例,设置这个对象的Method属性为"POST",ContentType属性为"application/x-/www- ...

  5. 优分享VR开源啦,优分享VR是基于Google VR开发的一款手机VR视频资源的聚合软件

    欢迎来到优分享VR开源项目 优分享VR 开源中国Git地址: http://git.oschina.net/xumingwang/youkes_vr 优分享VR是 优分享安卓APP VR视频播放开源部 ...

  6. 用户名 不在 sudoers文件中,此事将被报告。

    原文解决方法:http://blog.csdn.net/lincyang/article/details/21020295 CentOS7.0 用到sudo权限的时候出现的问题,如题. sudo命令可 ...

  7. TCP 滑动窗口的简介

    TCP 滑动窗口的简介 POSTED BY ADMIN ON AUG 1, 2012 IN FLOWS34ARTICLES | 0 COMMENTS TCP的滑动窗口主要有两个作用,一是提供TCP的可 ...

  8. 广州大学华软软件学院——NA视频下载

    准备工具: 360极速浏览器(不要认错图标了): 浏览器视频下载插件: 第一步:安装浏览器插件 1.打开浏览器 2.解压,找到插件文件: 3.把插件拖到浏览器中: 4.添加,然后就完成了插件安装 查看 ...

  9. hdoj 1856 More is better【求树的节点数】

    More is better Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 327680/102400 K (Java/Others) ...

  10. [Xcode使用 - 1] 自定义代码块引用

    Xcode本身带有编码常用的代码块可供使用,如下图   例如 “if” 这个代码块的定义     调用方法 1.可以直接拖放带编辑区   2.使用快捷键,键入 “if”, Xcode就会出现自动完成的 ...