TCP协议粘包问题详解

TCP协议粘包问题详解 前言

  在本章节中,我们将探讨TCP协议基于流式传输的最大一个问题,即粘包问题。本章主要介绍TCP粘包的原理与其三种解决粘包的方案。并且还会介绍为什么UDP协议不会产生粘包。

 

基于TCP协议的socket实现远程命令输入

  我们准备做一个可以在Client端远程执行Server端shell命令并拿到其执行结果的程序,而涉及到网络通信就必然会出现socket模块,关于如何抉择传输层协议的选择?我们选择使用TCP协议,因为它是可靠传输协议且数据量支持比UDP协议要大。好了废话不多说直接上代码了。

 

  Server端代码如下:

#!/usr/bin/env python3 # -*- coding:utf-8 -*- # ==== 基于TCP协议的socket实现远程命令输入之Server ==== import subprocess from socket import * server = socket(AF_INET, SOCK_STREAM) server.bind(("172.17.0.16",6666)) # 填入私网IP server.listen(5) while 1: # 链接循环 conn,client_addr = server.accept() while 1: # 通信循环 try: # 防止Windows平台下Client端异常关闭导致双向链接崩塌Server端异常的情况发生 cmd = conn.recv(1024) if not cmd: # 防止类Unix平台下Client端异常关闭导致双向链接崩塌Server端异常的情况发生 break res = subprocess.Popen(cmd.decode("utf-8"), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE,) stdout_res = res.stdout.read() # 正确结果 stderr_res = res.stderr.read() # 错误结果 # subprocess模块拿到的是bytes类型,所以直接发送即可 cmd_res = stdout_res if stdout_res else stderr_res # 因为两个结果只有一个有信息,所以我们只拿到有结果的那个 conn.send(cmd_res) except Exception: break conn.close() # 由于client端链接异常,故关闭链接循环

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwjwgz.html