.NET SSH 隧道 - “System.Net.Sockets.Socket”类型的对象无法转换为“System.Net.Sockets.TcpListener”类型的对象

Posted

技术标签:

【中文标题】.NET SSH 隧道 - “System.Net.Sockets.Socket”类型的对象无法转换为“System.Net.Sockets.TcpListener”类型的对象【英文标题】:.NET SSH tunnel - Object of type “System.Net.Sockets.Socket” cannot be converted to object of type “System.Net.Sockets.TcpListener” 【发布时间】:2019-11-03 02:05:49 【问题描述】:

我尝试使用chilversc 的代码并在此行收到错误消息

var listener = (TcpListener) typeof (ForwardedPortLocal).GetField ("_listener", BindingFlags.Instance | BindingFlags.NonPublic).GetValue (port);

可能是什么错误?

【问题讨论】:

【参考方案1】:

也许 Gist 是基于旧版本的 SSH.NET。

查看source code,错误消息是预期的。 _listenerSocket,而不是 TcpListener

_listener = new Socket(ep.AddressFamily, SocketType.Stream, ProtocolType.Tcp) NoDelay = true;

实际上,我认为只需将演员阵容从TcpListener 更改为Socket 即可解决您的问题,因为Socket 也具有LocalEndPoint 属性。

// Hack to allow dynamic local ports, ForwardedPortLocal should expose _listener.LocalEndpoint
var listener = (Socket)typeof (ForwardedPortLocal).GetField("_listener", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(port);
localPort = ((System.Net.IPEndPoint)listener.LocalEndPoint).Port;

【讨论】:

谢谢,但现在我得到“'Socket' 不包含'LocalEndpoint' 的定义,并且找不到接受'Socket' 类型的第一个参数的可访问扩展方法'LocalEndpoint'(你是缺少 using 指令或程序集引用?)" 这是一个错字。 SocketLocalEndPoint(大写 P)。 哦,是的,“LocalEndpoint”应该是“LocalEndPoint”。非常感谢!

以上是关于.NET SSH 隧道 - “System.Net.Sockets.Socket”类型的对象无法转换为“System.Net.Sockets.TcpListener”类型的对象的主要内容,如果未能解决你的问题,请参考以下文章

通过 SSH 隧道连接到 .Net Core 中的 AWS DocumentDb

无法通过 SSH 隧道克隆 git

通过 SSH 隧道连接到 Elasticsearch

远程+查询+Over+SSH+隧道

无法使用 sqlcmd 通过 SSH 隧道访问 SQL 数据库

通过公共 IP 访问 SSH 隧道 IIS“错误请求 - 无效主机名”