当client,调用read(socketfd,buffer,n)时,返回0的情况:

1、server端调用了close(soketfd)函数

2、server调用了close(fd,SHUT_WR),关闭server端的写连接,半关闭

关于close 和shutdown的过程

一.void close(fd):close发送的是FIN分节(不一定是发送FIN,也可能发送RST(如果local接受缓冲区的数据没有被读完);sever端close时候,如果发送了FIN,则这个sokcet在server端将不能够被read和write,会返回错误(如果有read或者write则返回errno9: Bad file descriptor错误)

默认状态,是把此套接字标记为关闭状态(真正只是把套接字的引用计数-1),close函数都立刻返回。如果引用计数为0,才开始发送四字节的FIN分节(连接终止序列),close在sever端调用之后,会立刻返回,同时尽力发送此时仍然在套接字发送缓冲区的发送数据,在此之后才会发出FIN四分节的连接终止序列。

扩展:在父子进程模型中,我们每次fork子进程之后,都需要在父进程中关闭连接套接字(connfd),而在子进程中都需要关闭监听套接字,此模型中accept在fork函数之前。

原因有两点:

1、如果不关闭,则父进程将消耗所以的可用描述符,因为它每次accept新连接,都得返回一个新的未用的fd

2.如果不关父进程中的connfd,则父子进程的引用计数都保持在2,即便子进程关闭,只是把引用计数-1,这样由于父进程正常情况永远不会关闭,所以这些连接其实永远都不会关闭,消耗资源,因为这阻挡了终止序列FIN的发出。

二:shutdown(int fd,int how)

close是关闭读写两个方向的数据传输,而shutdown指定关闭SHUT_WRS称为半关闭,只关闭一个方向,另一个方向依然可用。

两个参数的意思:

shutdown:SHUT_RD

server端关闭连接的读这一半,进程不能再对这样的套接字调用任何操作(如果有read则返回errno9: Bad file descriptor错误)。这个SHUT_RD标志告诉内核,我绝食了,再有吃的来(数据),不要放我的餐桌上了(接收缓冲区)直接扔给狗吃把。(但是此时client还是可以发送给server套接字的接收缓冲区,只是被TCP抛弃而已)

套接字不再有数据可接受,server不能调用read,server进程仍可往套接字发送数据,server套接字接收缓冲区中所有数据被丢弃,再接收到的任何数据都被TCP丢弃,对套接字发送缓冲区没有任何影响;

shutdown:SHUT_WR(又叫做半关闭):与close不同的是,无论引用计数是否为0,这样的操作都进行,此后server进程不能对此套接字进行写操作)

当前server套接字发送缓冲区中的内容被发送到对端,后跟正常的TCP连接终止序列(即发送FIN),

关闭连接的写这一半,进程不能再对这样的套接字调用任何操作;(如果server有write则返回errno9: Bad file descriptor错误)

在server的套接字上不能再发出发送请求,进程仍可从套接字接收数据,当前server套接字发送缓冲区中的内容被发送到对端,后跟正常的TCP连接终止序列(即发送FIN),对套接字接收缓冲区无任何影响;

注意:1. server端,close调用之后如果在local TCP buffer内如果还有数据没有读取会给对方,则主动直接发送RST给client, 否则发送FIN,这取决于调用close时刻local TCP buffer的状态, 跟对端是不是继续发送数据无关。

2. shutdown关闭读不会给对方发FIN, 只有关闭写才会发FIN, 而且跟local TCP buffer状态没关系,只发送FIN包,从不发送RST

总结:shutdown从不发送RST给对端(只发送FIN),只有close在接收缓存区没有被读完的条件下,才发送给对端RST。

socket 中read返回0的情况的更多相关文章

  1. Java中除数为0的情况

    转自http://blog.csdn.net/alanzyy/article/details/8591534 在数学中,规定被除数不能为0 那么在Java程序中一旦出现除数为0时,会出现什么情况呢: ...

  2. JavaScript中的ParseInt("08")和“09”返回0的原因分析及解决办法

    今天在程序中出现一个bugger ,调试了好久,最后才发现,原来是这个问题. 做了一个实验: alert(parseInt("01")),当这个里面的值为01====>07时 ...

  3. 在一个exe文件中查找指定内容,找到则返回起始位置, 否则返回0

    //在一个exe文件中查找指定内容,找到则返回起始位置, 否则返回0//如果某字符串, 直接传入字符串进来//如果要查找16进制,则用如下格式传参进来: #$1A#$2A#$3A function F ...

  4. 关于 OnCloseQuery: 顺序、不能关机等(所有的windows的广播消息都是逐窗口传递的)——如果一个窗体的OnCloseQuery事件中如果写了代码那么WM_QUERYENDSESSION消息就传不过去了msg.result会返回0,关机事件也就停止了

    系统关闭窗体的事件顺序为: OnCloseQuery ----> OnClose ----> OnDestroy 下面的代码说明问题: unit Unit3; interface uses ...

  5. sql server中的charindex函数用法解析(在一段字符中搜索字符或者字符串-----返回expression1在expression2出现的位置;反之,返回0)

    https://blog.csdn.net/xinghuo0007/article/details/70651358 知识点一:charindex()语法 CHARINDEX ( expression ...

  6. Python:判断文本中的用户名在数据库中是否存在,存在返回1,不存在返回0

    下面是我写的python的一个小脚本,作用是:判断文本中的用户名在数据库中是否存在,存在返回1,不存在返回0.用的是MySQL数据库. 要注意的是:strip函数的使用,该函数的作用是去除字符串两端多 ...

  7. Comparator中返回0导致数据丢失的大坑

    今天对一列数据进行排序,因为存储的是Map结构,要实现排序,马上就想到了TreeMap,于是查到API,这样新建TreeMap就能实现添加的时候就自动排序. new TreeMap<>(n ...

  8. 删除顺序表L中下标为p(0<=p<=length-1)的元素,成功返回1,不成功返回0,并将删除元素的值赋给e

    原创:转载请注明出处. [天勤2-2]删除顺序表L中下标为p(0<=p<=length-1)的元素,成功返回1,不成功返回0,并将删除元素的值赋给e 代码: //删除顺序表L中下标为p(0 ...

  9. 求一个整型数字中有没有相同的部分,例如12386123这个整型数字中相同的部分是123,相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0。方法是先将整型数字转换到数组中,再判断。函数为 int same(int num)其中num是输入的整型数字

    import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Test { pub ...

随机推荐

  1. asp.netcore di 实现批量接口注入

    废话少说,先上代码 public static Dictionary<Type, Type[]> GetImpleAndInterfaces(string assemblyName,str ...

  2. django的render的说明

    return render(request,"homesite.html",locals()) homesite.html页面中的所有内容都可以被渲染,不论是标签还是js代码,包括 ...

  3. 基于ActiveMQ的Topic的数据同步——消费者持久化

    前面一章中介绍了activemq的初步实现:基于ActiveMQ的Topic的数据同步——初步实现 下面来解决持久化订阅的问题: (1)使用queue,即队列时,每个消息只有一个消费者,所以,持久化很 ...

  4. android-auto-scroll-view-pager (无限广告轮播图)

    github 地址: https://github.com/Trinea/android-auto-scroll-view-pager Gradle: compile ('cn.trinea.andr ...

  5. js对象排序&&倒序

    按照对象的值大小排序对象 function sortObj(obj) { var arr = []; for (var i in obj) { arr.push([obj[i],i]); }; arr ...

  6. C++的引用的使用

    1引用的定义 引用时C++对C的一个重要的扩充,引用的作用是给变量起一个别名. 例如: int a; int &b=a;//声明b是a的引用 经过以上的声明,b就成为了a的别名,a和b的地位以 ...

  7. 分布式锁2 Java非常用技术方案探讨之ZooKeeper 【转载】

    前言:       由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分布式场景下数据一致性的问题,那么就要利用分布式锁来解决这些问题.以自己结合实际工作中的一些经验和网上看到的一些资料 ...

  8. String/StringBuilder 类 统计字符串中字符出现的次数

    1.1. 训练描述:[方法.String类] 一.需求说明:定义如下字符串: String str = “javajfiewjavajfiowfjavagkljjava”; 二.请分别定义方法统计出: ...

  9. 24-Fibonacci(dfs+剪枝)

    http://acm.hdu.edu.cn/showproblem.php?pid=5167 Fibonacci Time Limit: 2000/1000 MS (Java/Others)    M ...

  10. ROS Learning-011 beginner_Tutorials (编程) 编写 ROS 话题版的 Hello World 程序(Python版)

    ROS Indigo beginner_Tutorials-10 编写 ROS 话题版的 Hello World 程序(Python版) 我使用的虚拟机软件:VMware Workstation 11 ...