我是一个尝试理解TCP的初学者,我正在使用Rust。如果我创建一个新的侦听器并将其绑定到一个地址
let tcplistener = TcpListener::bind("127.0.0.1:55555").unwrap();
我可以tcplistener.accept()
127.0.0.1:55555
与客户端上的其他端点之间的新连接。
就我而言,tcplistener
位于表示插件的结构的实例中。每个插件都应该可以从自己的浏览器选项卡中控制。每个插件有一个连接(端点对),其中一个端点始终为127.0.0.1:55555
。插件在单个线程中运行,具有非阻塞侦听器和流。我使用websockets,但我不确定这个问题是否特定于websockets。
我现在正在做的是
tcplistener
字段分配给具有任意OS分配端口的新创建的侦听器这似乎有效;如果我之后实例化了一个新的插件B,我可以创建一个绑定到127.0.0.1:55555
并接受连接的侦听器。如果我没有创建一个具有不同地址/端口的新监听器,那么我得到的#34;地址已经在使用"错误。
这显然不是一个好的解决方案,因为它无缘无故地占用了所有其他端口。有更好的方法吗?
评论说:
为什么每个插件都有
TcpListener
?为什么没有一个组件与监听器,调用accept
,然后将返回的TcpStream
交给每个构建的插件?
这听起来不错,但是TcpListener
会在哪里存储,以及它如何传递流?我看到存储的可能性:
答案 0 :(得分:1)
如果我正确理解您的所有限制,一种解决方法是使用Option
。 Option
用于“某事或某事物”的情况。
在这里,您可以拥有Option<TcpListener>
。在新初始化的插件上,这将设置为Some(...)
,一旦被接受,将转换为None
。
这确实有许多缺点:
None
的可能性。如果看似合理,某种亲子关系可能更好,甚至限制为单身插件。