目前市场上有不少成熟稳定的内网穿透产品可供选择,以下是其中几个知名的产品:
-
花生壳:作为国内知名的内网穿透服务商,花生壳提供了多种方式实现内网穿透,包括映射端口、内网穿透代理、TCP/UDP 端口映射等方式。其客户端支持 Windows、Mac、Linux 和 Android 等多个平台。
-
神卓互联:神卓互联是国内另一家知名的内网穿透服务商,也提供了多种实现方式,包括端口映射、Websocket 穿透、TCP/UDP 端口映射等。其客户端支持 Windows、Mac、Linux 和 Android 等平台。
-
ngrok:ngrok 是一个基于云端服务的内网穿透软件,支持 HTTP、TCP 和 TLS 等多种协议,同时提供了 API 接口方便二次开发。其客户端支持 Windows、Mac、Linux 和 ARM 平台。
-
frp:frp 是一款高性能的内网穿透工具,提供了 HTTP、TCP 和 UDP 等多种协议的支持,同时提供了丰富的配置选项和插件机制,可以满足各种不同场景的需求。其客户端支持 Windows、Mac、Linux 和 ARM 平台。
-
serso:serso 是一款轻量级的内网穿透工具,支持 TCP/UDP 端口映射、HTTP/HTTPS 穿透等多种方式,同时支持多平台客户端。serso 的特点是配置简单,易于使用。
这些内网穿透产品都拥有稳定的性能和丰富的功能,可根据具体需求选择适合自己的产品。
自己也想写一个来着,后来发现难度太大放弃了,比如在释放内存这里都过不了关,呜呜,在给定代码中,使用std::unordered_set<std::shared_ptr<Connection>>
来存储连接对象,主要是为了方便进行查找和删除操作。
由于每个连接对象都有一个唯一的文件描述符(fd),因此可以使用std::find_if
算法来查找指定fd对应的连接对象,如下所示:
auto connection = std::find_if(connections.begin(), connections.end(), [fd](const std::shared_ptr<Connection>& conn) {
return conn->getFd() == fd;
});
if (connection == connections.end()) {
std::cerr << "Failed to find connection for fd " << fd << std::endl;
return;
}
而如果使用std::vector<Connection>
来存储连接对象,则需要遍历整个vector才能找到对应的连接对象,这样的复杂度为O(n),不如使用std::unordered_set
来存储连接对象,这样的复杂度为O(1)。
此外,由于每个连接对象都可能被多个事件共享,因此使用std::shared_ptr
来管理连接对象的内存,可以确保在不需要该连接对象时能够正确地释放其内存。