day26作业

TCP三次握手,四次挥手

三次握手

建立双向通道。建立好连接

TCP三次握手过程中使用了TCP标志 SYN 和 ACK

  • 第一次握手,建立连接过程中,客户端发送SYN包(SYN=n)到服务端,并进入SYN_SEND状态,等待服务器确认。
  • 第二次握手,服务器收到SYN包,必须确认客户端的SYN(ack=n+1),同时也要自己发送一条消息(SYN=m),此时服务器进入SYN_RECV状态
  • 第三次握手,客户端收到服务端的SYN+ACK包,向服务端发送确认包ACK(m+1),发送完毕,完成三次握手

四次挥手

  • 客户端发送一个FIN,用来关闭客户A到服务端的数据传送。
  • 服务端收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。
  • 服务端关闭与客户端A的连接,发送一个FIN给客户端。
  • 客户端发回ACK报文确认,并将确认序号设置为收到序号加1。

注:三次握手与四次挥手有一个反馈机制,客户端往服务端发送消息,必须要有服务端确认,如果服务端没有确认,客户端就会在某个时间不停的发送

练习

'''
2.基于TCP开发一款远程CMD程序
客户端连接服务器后,可以向服务器发送命令
服务器收到命令后执行,无论执行是否成功,无论执行几遍,都将执行结果返回给客户端

注意: 执行系统指令使用subprocess模块完成.
'''

# server.py

import socket
import subprocess

server = socket.socket()
server.bind(
    ('127.0.0.1', 8888)
)

server.listen(5)

while True:
    conn, addr = server.accept()
    print(addr)

    while True:
        try:
            cmd = conn.recv(1024).decode('utf-8')
            print('来自客户端的命令:', cmd)

            if len(cmd) == 0:
                continue

            if cmd == 'q':
                break

            res = subprocess.Popen(cmd, shell=True,
                                   stderr=subprocess.PIPE,
                                   #stdin=subprocess.PIPE,
                                   stdout=subprocess.PIPE)
            data1 = res.stdout.read()
            data2 = res.stderr.read()


            conn.send(data1 + data2)
            print('客户端中内容为:
', (data1+data2).decode('gbk'))

        except Exception as e:
            print(e)
            break

    conn.close()
    
    
    
# client
import socket

client = socket.socket()
client.connect(
    ('127.0.0.1', 8888)
)

while True:
    cmd = input('输入命令:')
    client.send(cmd.encode('utf-8'))

    if cmd== 'q':
        break

    data = client.recv(1024).decode('gbk')
    print(data)

client.close()
原文地址:https://www.cnblogs.com/setcreed/p/11695232.html