【问题标题】:.NET SSH tunnel - Object of type “System.Net.Sockets.Socket” cannot be converted to object of type “System.Net.Sockets.TcpListener”.NET SSH 隧道 - “System.Net.Sockets.Socket”类型的对象无法转换为“System.Net.Sockets.TcpListener”类型的对象
【发布时间】:2026-01-25 23:55:01
【问题描述】:

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

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

可能是什么错误?

【问题讨论】:

    标签: c# .net ssh-tunnel


    【解决方案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”。非常感谢!