【问题标题】:Network interface simulation in Python?Python中的网络接口模拟?
【发布时间】:2012-06-29 08:33:33
【问题描述】:

我正在使用 Python 为数字收音机制作模拟器。无线电通过 RF 中继一个 RS-232 端口和一个以太网端口,一对无线电构成无缝管道。因此,模拟器将成对使用,它们之间的管道模拟射频链路,允许用户使用物理接口、虚拟接口或隧道连接到每一端。

对于 RF 串行端口,我使用 PySerial 和虚拟串行端口使模拟器尽可能通用:我可以将模拟器连接到物理串行端口、网络套接字或另一个本地程序。除了用于在每个不同操作系统上创建虚拟串行端口的工具之外,这种方法是完全跨平台的。

我希望模拟器能够通过虚拟接口与本地程序联网,通过共享网络接口与远程程序联网,并通过专用于模拟器的本地物理接口与远程程序联网.但到目前为止,我还没有找到一种直接的方法来做到这一点。我一直在研究 SLIP/PPP、TAP/DUN、pcap/SOCK_RAW 和其他可能性,但没有发现明显或通用的解决方案。

关键的困难似乎在于这涉及到整个以太网接口,低于 IP 级别,在以太网协议本身的级别:如果它只有几个端口,解决方案会相对简单。还是我遗漏了一些非常明显的东西?

如何使用 Python 以与 RF 串行接口解决方案一样通用的方式创建和使用 RF 以太网接口?

【问题讨论】:

  • Dummynetns-3 看起来很有趣,而且都是跨平台的。
  • 添加 TAP(或者可能是 TUN)接口,我可以开始了!

标签: python networking interface simulation


【解决方案1】:

您可以使用这个 Python 库:rawsocketpy 它允许在第 2 层使用原始套接字(使用以太网 II 协议)=> 没有 IP/TCP/UDP 标头。

#!/usr/bin/env python
from rawsocketpy import RawSocket

sock = RawSocket("wlp2s0", 0xEEFA)
sock.send("some data")
sock.send("personal data", dest="\xAA\xBB\xCC\xDD\xEE\xFF")

或服务器形式:

#!/usr/bin/env python
from rawsocketpy import RawRequestHandler, RawAsyncServerCallback
import time

def callback(handler, server):
    print("Testing")
    handler.setup()
    handler.handle()
    handler.finish()

class LongTaskTest(RawRequestHandler):
    def handle(self):
        time.sleep(1)
        print(self.packet)

    def finish(self):
        print("End")

    def setup(self):
        print("Begin") 

def main():
    rs = RawAsyncServerCallback("wlp2s0", 0xEEFA, LongTaskTest, callback)
    rs.spin()

if __name__ == '__main__':
    main()

【讨论】:

    【解决方案2】:

    人们发布的大量答案鼓励我跳出框框思考。

    我的方法是使用 Dummynet,这是一个真正令人惊叹的多功能工具。不幸的是,Dummynet Windows 和 Linux 端口没有得到很好的维护,这意味着我将运行 *BSD。

    但这简化了事情,因为 *BSD 映像也可以作为 VM 运行,这大大简化了虚拟接口的处理。

    如果我担心大小,我可以使用 picoBSD 或 nanoBSD 为我的模拟器制作一个小型定制系统。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-31
      • 1970-01-01
      • 2021-09-16
      • 2010-09-10
      • 2012-08-07
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多