粘包问题,以及在python中如何调用操作系统命令

一.新模块‘subprocess‘

复习: 在os模块中调用系统命令
import os
f = os.popen(‘dir‘)
print(f.read())

上面的结果和下面的写法是一样的
import subprocess
r = subprocess.Popen(‘ls‘,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

# subprocess.Popen(cmd,shell=True,subprocess.stdout,subprocess.stderr)
# cmd : 代表系统命令
# shell = True   代表这条命令是 系统命令,告诉操作系统,将cmd当成系统命令去执行
# stdout   是执行完系统命令之后,用于保存结果的一个管道
# stderr   是执行完系统命令之后,用于保存错误结果的一个管道
stdout = r.stdout.read().decode(‘gbk‘)
stderr = r.stderr.read().decode(‘gbk‘)
print(‘正确的返回结果:‘,stdout)
print(‘错误的返回结果:‘,stderr)
print(‘错误的返回结果:‘,stderr)

二.粘包问题  (只有tcp协议才会发送粘包,udp不会发生)

EX: 发送端发送数据,接收端不知道应该如何去接收,造成的一种数据混乱的现象

1.合包机制(nagle算法): 将多次连续发送且间隔较小的数据,进行打包成一块数据传送.

2.拆包机制: 还有一个机制是拆包机制,在发送端,因为受到网卡的MTU限制,会将大的超过MTU限制的数据,进行拆分,拆分成多个小的数据,进行传输.  当传输到目标主机的操作系统层时,会重新将多个小的数据合并成原本的数据

针对 使用udp协议发送数据,一次收发大小究竟多少合适?
  udp不会发生粘包,udp协议本层对一次收发数据大小的限制是:
    65535 - ip包头(20) - udp包头(8) = 65507

  站在数据链路层,因为网卡的MTU一般被限制在了1500,所以对于数据链路层来说,一次收发数据的大小被限制在  1500 - ip包头(20) - udp包头(8) = 1472

得到结论:
    如果sendto(num)

     num > 65507  报错
     1472 < num < 65507  会在数据链路层拆包,而udp本身就是不可靠协议,所以一旦拆包之后,造成的多个小数据包在网络传输中,如果丢任何一个,那么此次数据传输失败
     num < 1472 是比较理想的状态

原文地址:https://www.cnblogs.com/shuai1993/p/9477472.html

时间: 2024-10-20 21:35:37

粘包问题,以及在python中如何调用操作系统命令的相关文章

Python中的切片操作

Python中的切片操作功能十分强大,通常我们利用切片来进行提取信息,进行相关的操作,下面就是一些切片的列子,一起来看看吧,希望对大家学习python有所帮助. 列如我们从range函数1-100中取7的倍数,函数及结果如下所示: >>> for i in range(1,100)[6::7]: print i 7 14 21 28 35 42 49 56 63 70 77 84 91 98 取一个list或tuple的部分元素是非常常见的操作.比如,一个list如下: >>

linux 下的动态库制作 以及在python 中如何调用 c 函数库

动态库: 动态库又称动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件.动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数.函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译.链接并与使用它们的进程分开存储的函数.DLL 还有助于共享数据和资源.多个应用程序可同时访问内存中单个DLL 副本的内容.DLL 是一个包含可由多个程序同时使用的代码和数据的库.Wind

python中的字符串操作

python中没有单独的字符串类型,一个字符串就是长度为1的字符串.字符串可以用(slice)几号来指定字串,片段即是用冒号隔开的两个下标: >>>word='Help'+'A' >>>word 'HelpA' >>>word[0:2] 片段的缺省值:第一下标缺省为零,第二下标省略时为字符串的长度. 下标允许为负,这时从右向左数. >>>word[-1] 'A' >>>word[-2:0] 'pA' >>

Python 中 &quot;is&quot; 与 &quot;==&quot; 操作有什么区别?

转自:https://foofish.net/what-is-difference-between-is-and-euqals.html 在 Python 中,比较两个对象(变量)是否相等,可以用 "is" 和 "==" 操作,但它俩有什么区别?什么时候用 "is",什么时候用 "==" ?在面试时,发现不少候选人很难把这两者完全说清楚,因此在这篇文章中,「Python之禅」将对二者进行深入浅出的对比介绍. 先举个例子 小黄最

Python中字符串的操作

在python中字符串的包围的引号有三种,单引号,双引号,三引号,其中,单引号和双引号完全相同,在python中单引号也可完成转义工作 >>>print('doesn\'t \n it?') doesn't it? 但经常性的,一般使用 单双引号+转义更为普遍 >>>print("doesn't \n it?") doesn't  it? 三引号的使用,三引号(三个单引号或者三个双引号)用来座位注释,文档说明,类描述,用于比较广泛,他可以包含单引号,

python中json的操作示例

先上一段示例 # -*- coding: cp936 -*- import json #构造一个示例数据,并打印成易读样式 j = {} j["userName"]="admin" j["realName"]="管理员" j["cookie"]="afasfasfasdfasdfasf" print json.dumps(j, ensure_ascii=False, indent=4)

python中Excel表操作

python中关于excel表个的操作 使用 python中的xlwt和xlrd模块进行操作 # 2003之前:Excel:xls# 2003之后:Excel:xlsx# xlrd:读取的模块:xls,xlsx# xlwt:写分模块:xls# openpyxl:既能读也能写,只能操作xlsx 所以后面一般操作excel表格最好是使用openpyxl进行操作 # encoding=utf-8 import time import xlrd import xlwt import openpyxl i

【Python】解析Python中的文件操作

目录结构: contents structure [-] 简介 Python中的文件类型 内置函数的文件操作 open()函数 Mode 创建文本文件 读取文本文件 循环文件对象 关闭文件 With语句 os模块 fileinput模块 1.简介 在Python中无需引入额外的模块来进行文件操作,Python拥有内置的文件操作函数(除了内置文件操作函数,Python语言也提供了额外的文件操作模块,它们具有更加强大的功能). os模块提供了在操作系统上可移植的文件操作方法.如果只是想要读取和写入数

mysql数据库在Python中的简单操作

from pymysql import connect def check_data(cur): sql = "select * from student;" # sql语句 cur.execute(sql) # 执行sql语句 # 获取查询的所有记录 result = cur.fetchall() print(result) for value in result: print(value) def insert_data(cur, conn): sql = ""