了解一些边界条件,通过观察这些情形,弄清在网络层次发生什么以及它们怎样反映到套接字api,这将很多其它地理解这些层次的工作原理,体会怎样编写应用程序来处理这些情形。

//--------------------------------1.刚连接立即断开----------------------------------

当三TCP路握手完毕从而连接建立之后。客户TCP却发送了RST,在server端看来,就在该连接已由TCP排队,等着server进程调用accept的时候RST到达。

怎样处理这样的中止的连接依赖于不同的实现,源自Berkley的实现全然在内核中处理中止的连接,server进程根本看不到。大多数SVR4实现则返回一个错误给server进程。作为accept的返回结果。

//--------------------------------2.server进程终止----------------------------------

验证一切正常后,找到server子进程的进程id,运行kill杀死子进程id,作为进程终止处理的部分工作,子进程中全部打开着的描写叙述符都被关闭,这就导致向客户发送一个FIN。而客户TCP则响应以一个ACK,这就是TCP连接终止的工作的前半部分。

而客户堵塞在fgets调用上。等待从终端接收一行文本。于是键入另外一行文本,客户TCP接着把数据发送给server。TCP同意这么做。由于客户TCP接收到FIN仅仅是表示server进程已经关闭了连接的server端,从而进程不再往当中发送不论什么数据而已(而非并不是告知客户TCPserver进程已经终止)。

当serverTCP接收到来自客户的数据时,既然先前打开那个套接字的进程已经终止。于是响应一个RST(可通过tcpdump命令验证)。

接着的情况分为2种,得看时序了

1.由于客户在刚刚调用writen后。马上调用readline,而且由于之前TCP接收到的FIN(RST还没到),所以readline马上返回0。即受到未预期的EOF,于是以出错信息(server terminated prematurely。服务器过早终止)。

2.假设readline发生在收到RST之后,这时候客户既收到了FIN,又收到了RST,则readline返回一个ECONNRESET,即connection rest by peer,对方复位连接的错误。

//--------------------------------------3.SIGPIPE-------------------------------------------

当进程向某个已收到RST的套接字运行写操作时,内核该进程发送一个SIGPIPE信号,该信号的默认行为是终止进程,因此进程必须捕获它以免不情愿地被终止,但不管该进程是捕获该信号并从其信号处理函数返回还是简单忽略该信号,写操作都将返回EPIPE错误。

第一次写操作引发收到RST。第二次引发SIGPIPE信号,写一个已经接收到FIN的套接字不成问题,可是写一个已经接收到RST的套接字则是个错误。

假设SIGPIPE信号出现时须要採取特殊措施,可能须要在日志文件里登记,那么就必须捕获该信号。

//------------------------------------4.server主机崩溃---------------------------------------

当server和client确认正常后,然后从网络上断开server主机。并在客户键入另外一行文本,这样也模拟了当客户发送数据时server主机不可达的情形,即建立连接后某些中间路由器不工作的情形。

客户writen后,随后堵塞于readline的调用,假设用tcpdump观察网络就会发现,客户TCP持续重传数据分节,试图从server上接收一个ACK。

源自Berkley的实现重传该数据分节12次,共等待约9分钟才放弃重传。当客户TCP最后最终放弃时,给客户进程返回一个错误。

既然客户堵塞在readline函数调用上。那么该调用将返回一个错误。假设server追已崩溃,从而对客户的数据分节根本没有响应,那么所返回的错误时是ETIMEDOUT,然后假设某个中间路由器判定server主机已不可达。从而响应一个destination
unreachable的ICMP消息,那么所返回的错误是EHOSTUNREACH或ENETUNREACH。

虽然我们客户终于还是能够发现对端主机已经崩溃或者不可达。只是有时候我们须要比不得不等待9分钟更快地检測出这样的情况。所用的方法就是对readline调用设置一个超时。

//------------------------------------5.server崩溃后重新启动----------------------------------------

如上的情况下,假设在server主机崩溃时客户不主动给server发送数据,那么客户将不会知道服务里主机已经崩溃(没使用KEEP_ALIVE套接字心跳包选项)。

连接建立正常后。server主机崩溃并重新启动,接着在客户上键入一行文本,它将作为一个TCP数据分节发送到server主机。

当server主机崩溃后重新启动时。它的TCP丢失了崩溃前的全部连接信息,因此serverTCP对于所收到的来自客户的数据分节响应以一个RST,当客户TCP收到该RST时,客户正堵塞于readline调用。导致该调用返回ECONNRESET错误。

//----------------------------------6.server主机关机----------------------------------------

当server进程正在执行时,server主机被操作员关机时将会发生什么呢。Unix 系统关机时,init进程通常先给全部进程发送SIGTERM信号(该信号可被捕获),等待一段固定时间(往往是5~20秒之间),然后给全部仍在执行的进程发送SIGKILL信号(该信号不能被捕获)。这么做留给全部执行的进程一小段的时间来清除和终止。假设我们不捕获SIGTERM信号并终止,我们的server将由SIGKILL信号终止。接下来和第2条一样了。

apue和unp的学习之旅07——多种边界条件的讨论的更多相关文章

  1. WCF学习之旅—第三个示例之四(三十)

           上接WCF学习之旅—第三个示例之一(二十七)               WCF学习之旅—第三个示例之二(二十八)              WCF学习之旅—第三个示例之三(二十九)   ...

  2. Hadoop学习之旅二:HDFS

    本文基于Hadoop1.X 概述 分布式文件系统主要用来解决如下几个问题: 读写大文件 加速运算 对于某些体积巨大的文件,比如其大小超过了计算机文件系统所能存放的最大限制或者是其大小甚至超过了计算机整 ...

  3. WCF学习之旅—第三个示例之二(二十八)

    上接WCF学习之旅—第三个示例之一(二十七) 五.在项目BookMgr.Model创建实体类数据 第一步,安装Entity Framework 1)  使用NuGet下载最新版的Entity Fram ...

  4. WCF学习之旅—第三个示例之三(二十九)

    上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) 在上一篇文章中我们创建了实体对象与接口协定,在这一篇文章中我们来学习如何创建WCF的服务端代码.具体步骤见下面. ...

  5. WCF学习之旅—WCF服务部署到IIS7.5(九)

    上接   WCF学习之旅—WCF寄宿前的准备(八) 四.WCF服务部署到IIS7.5 我们把WCF寄宿在IIS之上,在IIS中宿主一个服务的主要优点是在发生客户端请求时宿主进程会被自动启动,并且你可以 ...

  6. WCF学习之旅—WCF服务部署到应用程序(十)

    上接  WCF学习之旅—WCF寄宿前的准备(八) WCF学习之旅—WCF服务部署到IIS7.5(九) 五.控制台应用程序宿主 (1) 在解决方案下新建控制台输出项目 ConsoleHosting.如下 ...

  7. WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) 七 WCF服务的Windows 服务程序寄宿 这种方式的服务寄宿,和IIS一样有一个一样 ...

  8. WCF学习之旅—WCF服务的WAS寄宿(十二)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) 八.WAS宿主 IIS ...

  9. WCF学习之旅—WCF服务的批量寄宿(十三)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) WCF学习之旅—WCF ...

随机推荐

  1. 解决HMC在IE浏览器无法登录的问题(Java Applet的使用问题)

    管理IBM的小型机必须要用到HMC(Hardware Management Console),有时候在使用测试环境使用的时候我们会把HMC装到自己电脑上的虚拟机里面,然后管理小型机,但是在虚拟机里面使 ...

  2. Git学习笔记 1,GitHub常用命令1

    廖雪峰Git教程 莫烦Git教程 莫烦Git视频教程 --------------- init > apt-get install git # 安装 > mkdir /home/yzn_g ...

  3. hiho 1055 刷油漆 树形dp

    一个简单的树上的背包问题. 代码: #include <iostream> #include <cstdio> #include <cstring> #includ ...

  4. MapReduce JOB 的输出与输出笔记。

    提高 MapReduce 价值,自定义输入和输出. 比如跳过存储到 HDFS 中这个耗时的布置. 而只是从原始数据源接受数据,或者直接将数据发送给某些处理程序. 这些处理程序在 MapReduce 作 ...

  5. KM最大匹配 HDU 2255

    KM算法详解+模板 - wenr - 博客园  http://www.cnblogs.com/wenruo/p/5264235.html #include<iostream> #inclu ...

  6. POJ3904 Sky Code【容斥原理】

    题目链接: http://poj.org/problem?id=3904 题目大意: 给你N个整数.从这N个数中选择4个数,使得这四个数的公约数为1.求满足条件的 四元组个数. 解题思路: 四个数的公 ...

  7. Cocos2d-x 3.0 Schedule in Node

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  8. bzoj1066【SCOI2007】蜥蜴

    1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2512  Solved: 1238 [Submit][Statu ...

  9. netsh http的使用

    1.首先通过cmd进入 C:\Windows\System32\inetsrv>netshnetsh>http netsh http> 退出的时候,使用exit命令 2.显示监听的i ...

  10. app引导效果introjs的使用

    1.引入 <!-- Add IntroJs styles --> <link href="../../introjs.css" rel="stylesh ...