.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,错误消息是预期的。 _listener
是 Socket
,而不是 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 指令或程序集引用?)" 这是一个错字。Socket
有 LocalEndPoint
(大写 P)。
哦,是的,“LocalEndpoint”应该是“LocalEndPoint”。非常感谢!以上是关于.NET SSH 隧道 - “System.Net.Sockets.Socket”类型的对象无法转换为“System.Net.Sockets.TcpListener”类型的对象的主要内容,如果未能解决你的问题,请参考以下文章
通过 SSH 隧道连接到 .Net Core 中的 AWS DocumentDb