首页 > 编程问答 >如何从 python socket.sendmsg 获取套接字 Tx 时间戳

如何从 python socket.sendmsg 获取套接字 Tx 时间戳

时间:2024-08-07 04:17:05浏览次数:8  
标签:python sockets networking socket.io timestamp

在阅读 此处 此处 此处 时,我发现在Linux系统上,您可以通过设置套接字选项来请求接收和传输的数据包的时间戳。我目前可以使用 SO_TIMESTAMPNS SO_TIMESTAMPING 来通过 recvmsg 获取 Rx 时间戳。使用 sendmsg 我不知道如何正确打包控制消息的辅助数据,并且 sendmsg 甚至没有可以保存我需要的数据的返回。

这就是我获取 Rx 时间戳的方式.

import socket    

SO_TIMESTAMPING = 37
SOF_TIMESTAMPING = 127

server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_sock.setsockopt(socket.SOL_SOCKET, SO_TIMESTAMPING, SO_TIMESTAMPING, SOF_TIMESTAMPING)

server_sock.bind((_svr_ip, _svr_port))
server_sock.listen(_num_clients)
conn, client_addr = server_sock.accept()

msg, ancdata, flags, address = conn.recvmsg(64, 1024)

t_rx = ancdata[0][2]
t_rx_s = int.from_bytes(t_rec[0:7], byteorder="little")
t_rx_ns = int.from_bytes(t_rec[8:], byteorder="little")

第 1.3.4 节 提到通过控制消息启用时间戳,而不必使用 socket.setsockopt 来保留开销。我相信这意味着您在调用 sendmsg 而不是使用 socket.setsockopt 时将标志添加到控制消息中。


很遗憾,你不能直接使用 socket.sendmsg 获取 Python 中的套接字 Tx 时间戳。

你对 Linux 套接字时间戳的理解是正确的。虽然你可以包含 SOF_TIMESTAMPING 控制消息以在每个数据报的基础上启用时间戳,但这仅适用于 接收 时间戳,使用 recvmsg 检索。

原因:

  • Tx 时间戳是在数据包离开网络接口时生成的 ,这发生在 Python 网络堆栈之外的内核中。当你调用 sendmsg 时,数据会被复制到内核缓冲区,而时间戳是在稍后的某个时间点异步生成的。
  • sendmsg 不提供检索此未来时间戳的机制。 它主要用于发送数据,并且控制消息用于设置套接字选项或附加辅助数据(如接收时间戳)。

备选方案:

  1. 使用 SO_TIMESTAMPNS recvmsg : 尽管你不能在 sendmsg 中获取 Tx 时间戳,但如果你在接收端也控制着应用程序,则可以使用 SO_TIMESTAMPNS recvmsg 来获取接收时间戳。这为你提供了数据包传输时间的近似值。

  2. 使用数据包嗅探器: 如果你需要更精确的 Tx 时间戳,请使用 tcpdump Wireshark 之类的外部工具。这些工具可以直接从网络接口捕获数据包并提供准确的时间戳。

  3. 使用更底层的网络库: 考虑使用 scapy dpkt 之类的库,这些库提供了对原始套接字和数据包操作的更多控制。使用这些库,你可能可以实现自定义时间戳机制,但它需要更深入地了解网络编程。

结论:

虽然 Python 的 socket 模块提供了对套接字时间戳的良好支持,但它不直接提供对 sendmsg 的 Tx 时间戳的访问权限。你可以探索上述备选方案来实现你的目标,具体取决于你的特定需求和约束。

标签:python,sockets,networking,socket.io,timestamp
From: 78840862

相关文章

  • Python 类型注释中“|”两边是否“强制”使用空格?
    “Union运算符”|没有出现在PEP8的其他建议中的“始终被空格包围的运算符”列表中因此,应该可以将其样式设置为类似于算术运算符,并删除圆括号、方括号内的空格,或者如果该运算符比表达式中的其他运算符具有更高的优先级。在我看来,删除空格可以提高表达式......
  • ArcPro (3.2+) Python 脚本工具中从 .atbx Toolbox 相对导入本地模块
    我设置了一个库和关联的ArcGISToolbox,以便:/root├──Toolbox.atbx├──mylib│└──my_function.py├──my_tools│└──my_gp_script.py我将代码存储库的开发克隆保存在公司共享服务器上的一个位置,并在GitHub上托管一份副本。当我进行更新时,我会......
  • Python vs. R:揭秘机器学习领域的双璧
    一、引言1.1背景介绍随着大数据和人工智能技术的飞速发展,机器学习已经成为了一个热门领域。在机器学习领域,Python和R是两种广泛使用的编程语言。Python因其简洁易读的语法和强大的库支持,成为了最受欢迎的编程语言之一。而R则以其强大的统计分析和数据可视化能力,在统计学......
  • Windows10 安装编译后的 pysqlcipher3-1.2.1 基于 Python 3.8.10
    Windows10安装编译后的pysqlcipher3-1.2.1基于Python3.8.10本文主要是将直接安装编译后的文件,不一定的成功,但是可以尝试使用,若无法直接安装,请参考编译过程,自行编译安装,编译过程见这里安装pysqlcipher3这里用32位举例因为64位安装完全相同,只需要把对应的位数换成64......
  • 【Python】Python基础语法知识点汇集
    Python是一种高级的、解释型的编程语言,以其清晰的语法和代码可读性而闻名。本篇文章将汇集Python编程的基础语法知识点,为初学者提供一个全面的学习指南。......
  • 启动Python 的内置服务器访问本地图片
    要使用Python的内置服务器访问本地图片并正确地显示在浏览器中,你需要将图片文件放在内置服务器的根目录或其子目录中。以下是详细步骤:1.将图片文件复制到服务器根目录:例如,将zheng.jpeg文件复制到一个特定的目录中(例如,你的项目目录)。假设你将图片文件复制到C:\Users\panda......
  • 17:Python数据类型练习题
    #1获取c1,c2相同的元素列表c1=[11,22,33]c2=[22,33,44]foriinc1:ifiinc2:print(i)#2获取c1中有,c2没有的元素列表foriinc1:ifinotinc2:print(i)#3获取c2中有,c1没有的元素列表foriinc2:ifinotinc1:print(i)#4获......
  • (Jmeter新玩法)Python 调 Jmeter执行参数化jmx脚本
    #Python调Jmeter执行参数化jmx脚本importosfromos.pathimportjoinimporttimeimportrefromstringimportTemplatejmeter_Home=r"F:\softtotal\xxx\bin\jmeter.bat"#jmx文件路径currpath=os.path.dirname(os.path.realpath(__file__))#要运行的jmx脚......
  • python爬虫预备知识三-多进程
    python实现多进程的方法:fork、multiprocessing模块创建多进程。os.fork方法os.fork方法只适合于unix/linux系统,不支持windows系统。fork方法调用一次会返回两次,原因在于操作系统将当前进程(父进程)复制出一份进程(子进程),这两个进程几乎完全相同,fork方法分别在父进程和子进程中......
  • PEP 8 – Python 代码风格指南中文版(七)
    编程建议(2) 定义异常时,应该从Exception类继承,而不是从BaseException类继承。直接从BaseException继承的异常通常是那些几乎不应该被捕获的异常。设计异常层次结构时,应该基于捕获异常的代码可能需要进行的区分,而不是基于异常被抛出的位置。目标是通过编程方式回答“出了......