使用python解码tcp数据包

2023-12-01

我正在尝试解码通过 TCP 连接收到的数据。数据包很小,不超过100字节。然而,当它们很多时,我会收到一些连接在一起的数据包。有没有办法防止这种情况。我正在使用Python

我尝试分离数据包,我的来源如下。数据包以STX字节开始,以ETX字节结束,STX后面的字节是数据包长度,(数据包长度小于5无效)校验和是ETX之前的最后一个字节

def decode(data):
  while True:
    start = data.find(STX)
    if start == -1: #no stx in message
        pkt = ''
        data = ''
        break
    #stx found , next byte is the length
    pktlen = ord(data[1])
    #check message ends in ETX (pktken -1) or checksum invalid
    if pktlen < 5 or data[pktlen-1] != ETX or checksum_valid(data[start:pktlen]) == False:
        print "Invalid Pkt"
        data = data[start+1:]
        continue
    else:
        pkt = data[start:pktlen]
        data = data[pktlen:]
        break

return data , pkt

我这样用

#process reports
try:
    data = sock.recv(256) 
except: continue 
else:
    while data:
        data, pkt = decode(data) 
        if pkt:
           process(pkt)

此外,如果数据流中有多个数据包,最好将数据包作为列表的集合返回还是只返回第一个数据包

我对python不太熟悉,只会C,这个方法可以吗?任何建议将不胜感激。提前致谢

Thanks


我将创建一个类,负责解码流中的数据包,如下所示:

class PacketDecoder(object):

    STX = ...
    ETX = ...

    def __init__(self):
        self._stream = ''

    def feed(self, buffer):
        self._stream += buffer

    def decode(self):
        '''
        Yields packets from the current stream.
        '''
        while len(self._stream) > 2:
            end = self._stream.find(self.ETX)
            if end == -1:
                break

            packet_len = ord(self._stream[1])
            packet = self._stream[:end]
            if packet_len >= 5 and check_sum_valid(packet):
                yield packet
            self._stream = self._stream[end+1:]

然后像这样使用:

decoder = PacketDecoder()
while True:
    data = sock.recv(256) 
    if not data:
        # handle lost connection... 
    decoder.feed(data)
    for packet in decoder.decode():
        process(packet)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用python解码tcp数据包 的相关文章

随机推荐

  • JPA RollbackException 但不在单元测试中

    我有一个 java 项目 其中包含一组单元测试 这些单元测试使用 JPA2 执行简单的更新和删除 单元测试运行没有问题 我可以验证数据库中的更改 一切都很好 我尝试在处理程序 Smartfox 扩展 中复制 粘贴相同的函数 我收到回滚异常
  • 我应该针对哪个版本的 Android 进行开发? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 刚刚开始为 Android 开发 想法是创建一个在 A
  • Flask sqlalchemy 多对多插入数据

    我试图在这里建立多对多关系Flask SQLAlchemy 但似乎不知道如何填写 多对多标识符数据库 您能帮助我了解我做错了什么以及它应该是什么样子吗 class User db Model tablename users user id
  • 如何使用 Applescript 构建和运行 Xcode?

    我正在尝试让 Xcode 使用 Applescript 构建和运行我的项目 这是同样的问题如何使用 Applescript 构建和运行 Xcode 但我认为这个答案可能已经过时了 因为它在我的机器上不起作用 我明白了 execution e
  • iOS CALayerInvalidGeometry

    我的应用程序崩溃了 并显示以下消息 由于未捕获的异常 CALayerInvalidGeometry 而终止应用程序 原因 CALayer 位置包含 NaN 2 74665e 34 nan 这里有更详细的异常消息 CALayer positi
  • 为什么碰撞不起作用,cocos2d v3?

    我用 cocos2d v3 创建了像 flappybird 这样的简单游戏 接口类 interface GameScene CCScene
  • 什么时候使用 CRC 比 MD5/SHA1 更合适?

    何时适合使用 CRC 进行错误检测 而不是使用 MD5 或 SHA1 等更现代的哈希函数 前者更容易在嵌入式硬件上实现吗 CRC 可以很好地检测数据中可能出现的随机错误 例如网络干扰 线路噪声 失真等 CRC 的计算复杂度远低于 MD5 或
  • 默认显示 Visual Studio 扩展工具栏

    在 Visual Studio 扩展中 我在 vsct 文件中将工具栏定义为 menu type Toolbar menu
  • 在什么情况下使用 EJB?网站/网络应用程序开发需要它们吗?

    EJBS 是否用于数据库支持的网站 所有人都可以访问 没有什么是永远的required当然 如果你愿意 你可以构建一个 Web 应用程序作为背后的单个大型 C 函数CGI 也就是说 EJB 确实使 Web 应用程序开发变得更加容易 它们被纳
  • SwiftUI 父子绑定:@StateObject 中的 @Published 不起作用,而 @State 起作用

    我有一个来自的自定义模态结构这个问题 代码如下 某些属性在模态视图中进行了修改 并通过Binding 问题是 当房产来自 StateObject Published更改不会反映在模式视图中 当使用一个简单的 State 最小示例 完整代码
  • 避免在使用层次结构参数的操作中进行静态绑定

    我发现了一个关于静态绑定的问题 我的真实课程非常扩展 所以我将使用几个玩具课程来表达我的问题 我们假设我们有以下层次结构 public class Element public class Element1 extends Element
  • 添加(减去)月份但不超过新月份的最后一天

    我希望可靠地添加和减去六个月 债券时间 lubridate 例如 添加六个月12 31 2014应该导致6 30 2015 并添加到2 28 2014应该导致8 31 2014 问题与as Date 2014 12 31 months 6
  • DOT 可以生成更结构化的图表吗?

    我不太确定如何描述我的客户想要什么 所以我会让一张图片来说明大部分内容 我正在使用 DOT 生成或多或少的物料清单问题的图表 显示所有级别的传入批次和所有传出批次 这些批次是根据传入批次中的材料创建的 我已经获得了创建包含适当结构化数据的图
  • 访问生产中的 Google App Engine Python 应用程序代码

    背景 我是 Google App Engine 的新手 熟悉其他云提供商的服务 我正在寻找类似于对生产节点的 shell 访问的访问 视图 使用基于 Python Django 的 Google App Engine 应用程序 我想查看生产
  • WPF Tab 键顺序工作错误

    我在 WPF 中有一个观点 我一直在努力使 Tab 键顺序正确 我有三个文本框 我们称它们为 Text1 Text2 和 Text3 和两个自定义控件 每个控件上都有几个其他文本框和各种控件 我们称它们为 Custom1 和 Custom2
  • Objective-c 在我的控制器中添加子视图

    我有一个与代表 控制器和其他一些东西相关的应用程序 问题是我用 init 初始化了控制器中的所有内容 此 init 创建 3 个 UIVIew openGL imagepickerview 和 MKMapView 我希望将这些视图添加到窗口
  • 获取 QF_UFNRA 中实数的小数部分

    使用 smtlib 我想使用 QF UFNRA 进行类似模数的操作 这使我无法使用 mod to int to real 之类的东西 最后我想在以下代码中获取 z 的小数部分 set logic QF UFNRA declare fun z
  • Rails 上的 Angular JS - 参数“RaffleCtrl”不是函数,未定义

    我正在关注 RoR 项目上的整数 Angular JS 教程 在我的控制器 js 文件中 我有以下内容 抽奖咖啡 Place all the behaviors and hooks related to the matching contr
  • 发布 Gmail 插件时出现问题

    我计划推出一个简单的 Gmail 插件 我已遵循发布指南中的每一步并填写了提交表格 然而现在已经过去两周了 我还没有收到任何回复 谁能告诉我我提交的内容需要多长时间才能得到审核 或者发布公共 Gmail 插件的步骤是什么 指南中的那些似乎不
  • 使用python解码tcp数据包

    我正在尝试解码通过 TCP 连接收到的数据 数据包很小 不超过100字节 然而 当它们很多时 我会收到一些连接在一起的数据包 有没有办法防止这种情况 我正在使用Python 我尝试分离数据包 我的来源如下 数据包以STX字节开始 以ETX字