zoukankan      html  css  js  c++  java
  • 课后作业 day26

    课后作业 day26

    一 TCP三次握手、四次挥手图

    三次握手

    第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认

    第二次握手:服务器收到syn包,必须确认客户端的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),此时服务器进入SYN_RECV状态

    第三次握手:客户端收到服务器的SYN+ACK包,并向服务器发送ACK确认包,此包发送完毕,客户端和服务器都进入 ESTABLISHED 状态(TCP连接成功)

    四次挥手

    1. 客户端进程发送连接释放报文,并且停止发送数据.释放数据报文首部,FIN=1,此时客户端进入FIN-WAIT-1状态
    2. 服务器收到连接释放报文,发送确认报文,ACK=1,ack=u+1,并且带上自己的序列号,此时服务端进入CLOSE-WAIT(关闭等待)状态.客户端收到服务器的确认请求之后,此时,客户端就进入FIN-WAIT-2状态,等待服务器发送连接释放报文(在这之前还需要接收服务器发送的最后数据)
    3. 服务器将所有的数据发送完毕之后,就像客户端发送连接释放报文,FIN=1,ack=u+1.此时服务器进入LAST-ACK(最后确认)状态,等待客户确认
    4. 客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,此时客户端就进入了TIME-WAIT(时间等待)状态.(此时TCP连接还没有释放,需经过2MSL的时间后,才进入CLOSED状态).服务器只要收到了客户端发出的确认请求,就立刻进入CLOSED状态

    二 基于TCP开发一款远程CMD程序

    客户端连接服务器后,可以向服务器发送命令
    服务器收到命令后执行,无论执行是否成功,无论执行几遍,都将执行结果返回给客户端

    #客户端
    import socket
    
    client = socket.socket()
    client.connect(('192.168.13.161',8888))
    while True:
        cmd_msg = input('请输入CMD命令:')
        client.send(cmd_msg.encode('utf-8'))
    
        if cmd_msg == 'q':
            break
    
        data = client.recv(1024).decode('utf-8')
    
        print(data)
    client.close()
    
    #服务端
    import socket
    import subprocess
    
    server = socket.socket()
    server.bind(('192.168.13.161',8888))
    server.listen(3)
    conn,addr = server.accept()
    while True:
        data = conn.recv(1024).decode('utf8')
    
        if data == 'q':
            break
    
        retcode, output = subprocess.getstatusoutput(data)
        print(retcode, output)
        output = output.encode('utf8')
    
        conn.send(output)
    
    conn.close()
    
  • 相关阅读:
    《c程序设计语言》读书笔记--大写转小写
    《c程序设计语言》读书笔记--字符串比较
    《c程序设计语言》读书笔记--反转字符串
    spring接收json字符串的两种方式
    logback的使用
    初识Vim
    Chrome控制台
    构造有层次的大纲
    让chrome浏览器快的不要不要的
    排序算法Java版
  • 原文地址:https://www.cnblogs.com/samoo/p/11694160.html
Copyright © 2011-2022 走看看