zoukankan      html  css  js  c++  java
  • 18.5 TCP的半关闭

    18.5 TCP的半关闭
    
    TCP 提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。
    
    这就是所谓的半关闭,
    
    
    我已经完成了数据传送,因此发送一个文件的结束(FIN)给另一端,
    
    但我还想接收另一端发来的数据,直到他给我发来文件结束(FIN)
    
    
    shutdown可以指定在某个方向上终止连接,通过指定标志:SHUT_RD, SHUT_WR, SHUT_RDWR。比如指定SHUT_WR后可以继续读数据,但不能写入了。而close是两个方向上终止连接。
    
    close会将描述符的引用计数减一,如果引用计数变为0就关闭描述符,发送FIN。而shutdown不管引用计数,直接发送FIN终止连接。所以在多线程下操作同一个socket描述符下,一个线程调用shutdown会使其他线程无法使用这个描述符,而调用close就不会影响到其他线程。
    
    
    shutdown()的调用是需要一个参数:0代表禁止下次的数据读取;1代表禁止下次的数据写入;2代表禁止下次的数据读取和写入。
    
    如果应用程序不调用c l o s e而调用s h u t d o w n,且第2个参数值为1,则插口的A P I支持
    半关闭。然而,大多数的应用程序通过调用close终止两个方向的连接。
    
    
    node2:/root#tcpdump -S -i lo dst port not 22 and dst port not 61326
    
    wireshark:
    
    import socket
    import time
    
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.connect(("192.168.137.2",8080))
    s.sendall("this is shutdown test" + "
    ")
    s.send("this is shutdown test")
    s.shutdown(socket.SHUT_RDWR)
    print(socket.SHUT_RDWR)
    print(socket.SHUT_RD)
    print(socket.SHUT_WR)
    time.sleep(10)
    s.shutdown(1)
    time.sleep(100)
    
    
    C:UsersTLCB>netstat -na | findstr 8080
      TCP    192.168.137.1:53276    192.168.137.2:8080     FIN_WAIT_2
    
    
    
    node1:/root#netstat -na | grep 137.1 | grep 8080
    tcp        1      0 192.168.137.2:8080          192.168.137.1:53276         CLOSE_WAIT  
    
    
    
    
    

  • 相关阅读:
    【Android】 分享一个完整的项目,适合新手!
    Android笔记:Fragment与ViewPager组合时,如何在FragmentActicity获取Fragment对象
    android 获取日期
    Java: 分解List<HashMap<String, String>>
    android ExpandableListView实现不同的布局
    android: activity切换之效果
    android: activity之间切换的抽屉效果
    android 获取适配的bitmap等相关
    Eclipse改变外观,护眼模式
    安装 NoMachine(NX) client and server
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13348574.html
Copyright © 2011-2022 走看看