Python中的网络接口仿真?

时间:2012-06-27 20:16:11

标签: python networking interface simulation

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

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

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

关键难点似乎是涉及整个以太网接口,低于IP级别,在以太网协议本身的层面:如果它只是几个端口,解决方案将相对简单。或者我错过了一些非常明显的东西?

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

2 个答案:

答案 0 :(得分:3)

人们发布的大量答案鼓励我开箱即用。

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

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

如果我关心尺寸,我可以使用picoBSD或nanoBSD为我的模拟器制作一个微小的定制系统。

答案 1 :(得分:0)

您可以使用以下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()