Unix网络编程(3)——C/S模型几种情况
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模型几种情况的更多相关文章
- UNIX网络编程——关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
1.阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有 区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回 ...
- Unix网络编程中的五种I/O模型_转
转自:Unix网络编程中的的五种I/O模型 下面主要是把unp第六章介绍的五种I/O模型. 1. 阻塞I/O模型 例如UDP函数recvfrom的内核到应用层.应用层到内核的调用过程是这样的:首先把描 ...
- UNIX网络编程——网络I/O模型
在学习UNIX网络编程的时候.一開始分不清 同步 和 异步,所以还是总结一下,理清下他们的差别比較好. IO分类 IO依据对IO的调度方式可分为堵塞IO.非堵塞IO.IO复用.信号驱动IO.异步IO. ...
- [转载] 读《UNIX网络编程 卷1:套接字联网API》
原文: http://cstdlib.com/tech/2014/10/09/read-unix-network-programming-1/ 文章写的很清楚, 适合初学者 最近看了<UNIX网 ...
- 记录一次配置unix网络编程环境的过程和遇到的问题
记录一次搭建unix网络编程环境过程中遇到的问题和总结 计算机环境虚拟机 linuxmint-18-xfce-64bit 1.打开unix网络编程.iso 把目录下的文件复制到某一目录,修改权限,可命 ...
- UNIX网络编程---简介
UNIX网络编程---简介 一. 概述 a) 在编写与计算机通信的程序时,首先要确定的就是和计算机通信的协议,从高层次来确定通信由哪个程序发起以及响应在合适产生.大多数 ...
- UNIX网络编程——epoll 的accept , read, write(重要)
在一个非阻塞的socket上调用read/write函数,返回EAGAIN或者EWOULDBLOCK(注:EAGAIN就是EWOULDBLOCK). 从字面上看,意思是: EAGAIN: 再试一次 E ...
- UNIX网络编程——客户/服务器程序设计示范(总结)
(1)当系统负载较轻是,每来一个客户请求现场派生一个子进程为之服务的传统并发服务器程序模型就足够了.这个模型甚至可以与inetd结合使用,也就是inetd处理每个连接的接收.我们的其他意见是就重负荷运 ...
- 【unix网络编程第三版】阅读笔记(五):I/O复用:select和poll函数
本博文主要针对UNP一书中的第六章内容来聊聊I/O复用技术以及其在网络编程中的实现 1. I/O复用技术 I/O多路复用是指内核一旦发现进程指定的一个或者多个I/O条件准备就绪,它就通知该进程.I/O ...
随机推荐
- MFC对话框
创建对话框步骤: 第一,创建对话框资源,主要包括创建新的对话框模板.设置对话框属性和为对话框添加各种控件: 第二,生成对话框类,主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 创建对话框类 ...
- ZOJ Light Bulb - 3203
题意:人左右走动,求影子L的最长长度. 思路:三分人在D上的位置.注意影子长=D-x+H-(H-h)*D/x. #include<iostream> #include<stdio.h ...
- 4.3 Reduction代码(Heterogeneous Parallel Programming class lab)
首先添加上Heterogeneous Parallel Programming class 中 lab: Reduction的代码: myReduction.c // MP Reduction // ...
- algorithm@ find the shortest path in a graph using BFS
Finding Shortest Paths By BFS
- nyoj 811 变态最大值
变态最大值 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描述 Yougth讲课的时候考察了一下求三个数最大值这个问题,没想到大家掌握的这么烂,幸好在他的帮助下大家算是解 ...
- WEB- 冻结TABLE的头和列
没认真去研究是怎么实现的,看到效果,心里觉的很牛,备注在这里 转载自:http://www.cnblogs.com/Microshaoft/archive/2011/08/10/2133434.htm ...
- Oracle- 表的自增长创建
Oracle创建自增长要先写序列还要去写触发器,不像MSSQLSERVER那样方便.但也是麻烦,记录如下: Oracle中,可以为每张表的主键创建一个单独的序列,然后从这个序列中获取自动增加的标识符, ...
- 安装Intel HAXM为Android 模拟器加速,30秒内启动完成
要求 必备知识 windows 7 基本操作. 运行环境 windows 7(64位); Android Studio 1.1.0;JDK 1.7.0_75(64位);android-sdk_r24 ...
- 【转】bt协议的详细分析
转自:https://baoz.net/bt-protocol/ 一 BT系统的组成结构 1 普通的Web服务器: 例如Apache或IIS服务器 2 一个静态的种子文件: 即. ...
- ThinkPHP CURD方法盘点:limit方法
limit方法也是模型类的连贯操作方法之一,主要用于指定查询和操作的数量,特别在分页查询的时候使用较多.ThinkPHP的limit方法可以兼容所有的数据库驱动类的. 用法 限制结果数量 例如获取满足 ...