簡體   English   中英

Python中的網絡接口仿真?

[英]Network interface simulation in Python?

我正在使用Python制作數字廣播的模擬器。 無線電通過RS-232端口和以太網端口的RF一中繼,一對無線電管制作無縫管道。 因此,模擬器將成對使用,它們之間的管道模擬RF鏈路,允許用戶使用物理接口,虛擬接口或隧道連接到每一端。

對於RF串行端口,我使用PySerial和虛擬串行端口使模擬器盡可能通用:我可以將模擬器連接到物理串行端口,網絡套接字或另一個本地程序。 除了用於在每個不同操作系統上創建虛擬串行端口的工具之外,此方法完全是跨平台的。

我希望模擬器能夠通過虛擬接口與本地程序聯網,通過共享網絡接口與遠程程序聯網,並通過專用於模擬器的本地物理接口與遠程程序聯網。 但到目前為止,我還沒有找到一種直截了當的方法來做到這一點。 我一直在關注SLIP / PPP,TAP / DUN,pcap / SOCK_RAW以及其他可能性,我看不出明顯或一般的解決方案。

關鍵的困難似乎是涉及整個以太網接口,低於IP級別,在以太網協議本身的層面:如果它只是幾個端口,解決方案將相對簡單。 或者我錯過了一些令人眼花繚亂的事情?

如何使用Python以與RF串行接口解決方案一樣多功能的方式創建和使用RF以太網接口?

人們發布的大量答案鼓勵我開箱即用。

我的方法是使用Dummynet,一個真正令人驚嘆的多功能工具。 不幸的是,Dummynet Windows和Linux端口維護得不好,這意味着我將運行* BSD。

但這簡化了事情,因為* BSD映像也可以作為VM運行,這極大地簡化了虛擬接口的處理。

如果我關心尺寸,我可以使用picoBSD或nanoBSD為我的模擬器制作一個微小的定制系統。

你可以使用這個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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM