我是一名嘗試瞭解TCP的初學者,我正在使用Rust。如果我創建一個新的偵聽器並將其綁定到一個地址如何爲多個消費者重用服務器端TCP端點?
let tcplistener = TcpListener::bind("127.0.0.1:55555").unwrap();
我可以127.0.0.1:55555
和客戶端上的一些其他端點之間tcplistener.accept()
新的連接。
在我的情況下,tcplistener
住在表示插件的結構的一個實例中。每個插件應該可以從它自己的瀏覽器選項卡控制。每個插件有一個連接(端點對),其中一個端點始終爲127.0.0.1:55555
。插件運行在一個非阻塞偵聽器和流的線程中。我使用websockets,但我不確定這個問題是否特定於websockets。
我現在正在做的是
- 實例化插件中
- 接受來自瀏覽器選項卡中的第一個連接到插件後一個
- ,在插件中的
tcplistener
領域分配給新創建任意操作系統分配端口的監聽器
這似乎工作;如果之後我實例化一個新的插件B,我可以創建一個綁定到127.0.0.1:55555
並接受連接的偵聽器。如果我不創建具有不同地址/端口的新偵聽器,則會出現「地址已被使用」錯誤。
這顯然不是一個好的解決方案,因爲它無緣無故地佔用了所有其他端口。有沒有更好的辦法?
註釋說:
爲什麼每個插件有
TcpListener
?爲什麼不給收聽者一個組件,請致電accept
,然後將返回的TcpStream
交給每個構建的插件?
這聽起來不錯,但是TcpListener
的存儲位置在哪裏?它如何切換流?我看到用於存儲的可能性:
- 房東。我無法修改插件主機,我只是插件作者。
- 一個專用插件。我看到的問題是,插件無法訪問存儲在另一個插件中的任何信息,所以我不知道該怎麼做。
- 一個單獨運行的過程。我可以想象單獨運行一臺服務器並讓插件成爲客戶端。用戶可以將他們的瀏覽器連接到服務器,該服務器以某種方式代理插件。聽起來很合理,但這裏的不便之處在於,插件用戶必須將服務器安裝爲單獨的軟件包。所以我真的想避免這種情況。雖然我想啓動服務器可以在插件實例化時自動完成,也許這是要走的路?
第一個建議(選項<>)起作用!這真的很棒!我完全不瞭解Option <>的本質,我必須更徹底地閱讀文檔。到目前爲止,它只用於空指針。我怎樣才能接受這個答案?關於實例化的建議:有趣的是,我還沒有完全想到它通過。我的猜測是實例化只能從主機完成。如果它*在技術上是可能的,那麼在其他地方我沒有看到它是不尋常的(理所當然,這並不意味着太多,我是一個初學者)。順便說一句,這是關於LV2音頻插件標準。 – poidl
您可能感興趣的https://www.reddit.com/r/rust/comments/61h21t/writing_an_audio_plugin_in_rust/ – Shepmaster
感謝您的鏈接,這看起來很有趣! – poidl