zoukankan      html  css  js  c++  java
  • 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(fd, SHUT_RD)告诉内核,我绝食了,再有吃的来(数据),不要放我的餐桌上了(接收缓冲区)直接扔给狗吃把。(但是此时还是可以发送给接收缓冲区,只是被TCP抛弃而已)
    shutdown(fd, SHUT_WR)内核发送FIN给对方数据发送完毕了
    得知 shut_RD不发送FIN,shut_rw比较主动的发出FIN

    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结束连接。

  • 相关阅读:
    C# 之 判断或设置以管理员身份运行程序
    幻灯片母版 讲义母版 备注母版 区别 技巧
    ArcGIS中国工具2.5正式发布
    ArcGIS教程:曲率
    arcgis pro行列转换
    在 Python 中使用 in_memory 工作空间
    ArcGIS10.6的新功能
    ArcGIS Pro 获得工具的个数
    Android Push Notification实现信息推送使用
    SignalR推送服务在Android的实现 SignalA
  • 原文地址:https://www.cnblogs.com/kkshaq/p/4439454.html
Copyright © 2011-2022 走看看