linux网络编程中的基本概念
int close(int fd)(假设是服务器端)
close 关闭了自身数据传输的两个方向。close一个TCP套接字的默认行为是把该套接字标记成已关闭,然后立即返回到调用进程。该套接字描述符不能再由调用进程使用,也就是说它不能作为read或write的第一个参数。然而TCP将尝试发送已排队等待发送到对端的任何数据,发送完毕后发生的是正常的TCP连接终止序列。
我们可以通过SO_LINGER套接字选项可以用来改变TCP套接字的这种默认行为。
注意:close会先尝试发送 在本套接字socket发送缓冲区的数据,然后进行TCP释放的操作,(正常情况是释放的4个分节),但是close默认情况只是,close的默认返回成功也只是成功发出了一个FIN分节,也不代表对端已经确认。
如果close的时候,此套接字的接收缓冲区中还有数据没有被应用层读取,此时关闭socket会导致直接向对端发送RST(close之后,此端主动传送RST),http://my.oschina.net/costaxu/blog/127394第三种情况
服务器端close之后,套接字描述符的引用计数减1,如果为0时,(套接字是文件),套接字就被关闭了。此时在服务器端调用read或者write(fd.....)就会出现ERRNO=EBADF /* Bad file descriptor */的错误。
shutdown函数的作用
shutdown:SHUT_RD:read没有影响,只是返回0;
关闭连接的读这一半,进程不能再对这样的套接字调用任何读操作;
在套接字上不能再发出接收请求,进程仍可往套接字发送数据,套接字接收缓冲区中所有数据被丢弃,此套接字再接收到的任何数据由TCP丢弃,对套接字发送缓冲区没有任何影响;
shutdown:SHUT_WR : 但是在调用shutdown关闭写之后不能再调用write方法,会引起错误终止程序,这里和上面的关闭读有差别,其实是在已发送FIN包后write该socket描述符会引发EPIPE/SIGPIPE。
关闭连接的写这一半,进程不能再对这样的套接字调用任何写操作;
在套接字上不能再发出发送请求,进程仍可从套接字接收数据,套接字发送缓冲区中的内容被发送到对端,后跟正常的TCP连接终止序列(即发送FIN),对套接字接收缓冲区无任何影响;
服务器shutdown:SHUT_RD之后,然后此端口read(fd)会返回0,说明文件末尾,http://blog.chinaunix.net/uid-23629988-id-3035613.html
Linux的版本是kernel-2.6.21:
1,只要TCP栈的读缓冲里还有未读取(read)数据,则调用close时会直接向对端发送RST。
2,shutdown与socket描述符没有关系,即使调用shutdown(fd, SHUT_RDWR)也不会关闭fd,最终还需close(fd)。
3,可以认为shutdown(fd, SHUT_RD)是空操作,因为shutdown后还可以继续从该socket读取数据,这点也许还需要进一步证实。
4,在已发送FIN包后write该socket描述符会引发EPIPE/SIGPIPE。
5,当有多个socket描述符指向同一socket对象时,调用close时首先会递减该对象的引用计数,计数为0时才会发送FIN包结束TCP连接。shutdown不同,只要以SHUT_WR/SHUT_RDWR方式调用即发送FIN包。
6,SO_LINGER与close,当SO_LINGER选项开启但超时值为0时,调用close直接发送RST(这样可以避免进入TIME_WAIT状态,但破坏了TCP协议的正常工作方式),SO_LINGER对shutdown无影响。
7,TCP连接上出现RST与随后可能的TIME_WAIT状态没有直接关系,主动发FIN包方必然会进入TIME_WAIT状态,除非不发送FIN而直接以发送RST结束连接。
linux网络编程中的基本概念的更多相关文章
- linux网络编程中INADDR_ANY的含义
INADDR_ANY选项 网络编程中常用到bind函数,需要绑定IP地址,这时可以设置INADDR_ANY INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或&q ...
- linux网络编程中的超时设置
1 下面是在网上找到的资料,先非常的感谢. 用setsockopt()来控制recv()与send()的超时 在send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,而设置收发超时 ...
- linux网络编程中的shutdown()与close()函数
1.close()函数 int close(int sockfd); //返回成功为0,出错为-1 close 一个套接字的默认行为是把套接字标记为已关闭,然后立即返回到调用进程,该套接字不能再由cl ...
- linux网络编程中阻塞和非阻塞socket的区别
读操作 对于阻塞的socket,当socket的接收缓冲区中没有数据时,read调用会一直阻塞住,直到有数据到来才返 回.当socket缓冲区中的数据量小于期望读取的数据量时,返回实际读取的字节数.当 ...
- Linux 网络编程中的read和write函数正确的使用方式
字节流套接字上的read和write函数所表现的行为不同于通常的文件IO,字节流套接字上调用read和write输入或输出的可能比请求的数量少,然而这不是出错的状态,例如某个中端使read和write ...
- linux网络编程中需要注意的信号SIGPIPE
在调试cs时,s端循环收,c端循环发,s端意外崩溃后,c端自动退出,终端提示SIGPIPE导致c端退出.man 7 signal: SIGPIPE Term Broken pipe: write to ...
- Linux网络编程中tcp_server和tcp_client函数的封装
本文的主要目的是将server套接字和client套接字的获取,做一个简易的封装,使用C语言完成. tcp_server 服务器端fd的获取主要分为以下几步: 1.创建socket,这一步仅仅 ...
- Proxy源代码分析——谈谈如何学习Linux网络编程
Linux是一个可靠性非常高的操作系统,但是所有用过Linux的朋友都会感觉到, Linux和Windows这样的"傻瓜"操作系统(这里丝毫没有贬低Windows的意思,相反这应该 ...
- Proxy源代码分析--谈谈如何学习Linux网络编程
http://blog.csdn.net/cloudtech/article/details/1823531 Linux是一个可靠性非常高的操作系统,但是所有用过Linux的朋友都会感觉到,Linux ...
随机推荐
- Facebook开源的JavaScript库:React
React是Facebook开源的JavaScript库,采用声明式范例,可以传递声明代码,最大限度地减少与DOM的交互. React是Facebook开源的JavaScript库,用于构建UI.你可 ...
- Python函数(十)-装饰器(三)
如果多个函数想通过一个装饰器来实现不同的功能的话,可以给装饰器传入参数,让装饰器里的函数对参数进行判断,来实现不同的功能 # -*- coding:utf-8 -*- __author__ = &qu ...
- python(时间模块,序列化模块等)
一.time模块 表示时间的三种方式: 时间戳:数字(计算机能认识的) 时间字符串:t='2012-12-12' 结构化时间:time.struct_time(tm_year=2017, tm_mon ...
- ios配合iTuns提取应用Documents下的文件到本地
出处:http://blog.csdn.net/jianandjan/article/details/50442988 有一些App需要通过使用iTunes让用户上传和下载文档.要让iOS程序支持iT ...
- css水平居中(一)
第一种方法:使用text-align属性. 看到一篇博客,也不知道是不是我理解的问题,博客上说text-align可以是内联元素水平居中,我感觉这样的说法是不是有些不准确. text-align属性规 ...
- hadoop job -kill 与 yarn application -kii(作业卡了或作业重复提交或MapReduce任务运行到running job卡住)
问题详情 解决办法 [hadoop@master ~]$ hadoop job -kill job_1493782088693_0001 DEPRECATED: Use of this script ...
- 关于web.xml中的<welcome-file-list>中的默认首页文件
先看我的配置文件: <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome ...
- 框架之 hibernate简单入门
hibernate框架的搭建 Hibernate框架的概述 1. Hibernate框架的概述 * Hibernate称为 * Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JD ...
- Codeforces 1136F Cooperative Game (神仙题)
这种题就是难者不会,会者不难. 博客讲的很详细了 代码: #include <bits/stdc++.h> using namespace std; string s; int read( ...
- 【转】PEAR安装、管理及使用
PEAR安装 linux下只要你安装的是PHP 4.3.0以上的版本,默认安装都是支持PEAR的,除非你使用了”--WITHOUT-PEAR”选项,修改PHP.INI文件,在INCLUDE_PAT ...