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. SpringSide 3 中的多数据源配置的问题

    在SpringSide 3 中,白衣提供的预先配置好的环境非常有利于用户进行快速开发,但是同时也会为扩展带来一些困难.最直接的例子就是关于在项目中使用多个数据源的问题,似乎很难搞.在上一篇中,我探讨了 ...

  2. 房租管理小软件(四):对linq的使用

    1.对LInq的封装如下: private static System.Data.Linq.Mapping.MappingSource mappingSource = new AttributeMap ...

  3. 企业移动互联网O2O微信支付流程图

    过去一周里最受关注的应该就是微信了,腾讯合作伙伴大会微信分论坛的火爆现场,没有亲临其境是无法想象的,近3000人报名,2000多人来到现场,试图进入只能容纳300人的会场…… 闲话不表,进入正题吧,本 ...

  4. Matlab GUI界面

    做SVD的时候,看学姐的demo,用到了matlab的GUI,感兴趣就自己学了一下: 从简单的例子说起吧. 创建Matlab GUI界面通常有两种方式: 1,使用 .m 文件直接动态添加控件     ...

  5. 零基础学习hadoop到上手工作线路指导

    零基础学习hadoop,没有想象的那么困难,也没有想象的那么容易.在刚接触云计算,曾经想过培训,但是培训机构的选择就让我很纠结.所以索性就自己学习了.整个过程整理一下,给大家参考,欢迎讨论,共同学习. ...

  6. about云资源汇总指引V1.4:包括hadoop,openstack,nosql,虚拟化

    hadoop资料 云端云计算2G基础课程 (Hadoop简介.安装与范例) 炼数成金3G视频分享下载 虚拟机三种网络模式该如何上网指导此为视频 Hadoop传智播客七天hadoop(3800元)视频, ...

  7. HW7.1

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  8. kvm guest usb mapping

    http://www.linux-kvm.org/page/USB#Input_devices http://www.linux-kvm.org/page/USB_Host_Device_Assign ...

  9. 单点登录与消息队列以及在J2EE中的实现方案

    前言 这次为大家简单介绍两个在WEB开发中经常使用的概念——单点登录和消息队列以及具体到J2EE中的一些实现方案.本文原创性的工作比较少,主要是一些总结概括和自己的理解. 单点登录SSO SSO的业务 ...

  10. JSON简介以及用法代码汇总

    什么是JSON? JavaScript 对象表示法(JavaScript Object Notation). JSON是一种轻量级的数据交换格式,某个JSON格式的文件内部譬如可以长成这样: { &q ...