【发布时间】:2011-03-04 19:23:54
【问题描述】:
提前感谢您的建议。
我目前正在开发一个程序,该程序使用 Putty 创建与服务器的 SSH 连接,该服务器使用本地端口转发来启用客户端,运行我的软件,通过 localhost 访问 SSH 服务器后面的服务。
IE:客户端:20100 -> Internet -> 通过路由器/防火墙暴露的远程 SSH 服务器 -> 本地 Intranet -> Intranet Web POP3 Server:110。
命令行:“putty -ssh -2 -P 22 -C -L 20100:intranteIP:110 -pw sshpassword sshusername@sshserver”
客户端将使用 putty 创建与 SSH 服务器的 SSH 连接,在连接字符串中指定它希望将 Intranet POP3 服务器的端口 110 绑定到客户端系统上的端口 20100。因此,客户端将能够打开一个邮件客户端到 localhost:20100 并通过 SSH 隧道与内部 POP3 服务器交互。以上为一般性说明。我已经知道我正在尝试做的事情不会有问题,所以我不想就上述问题进行辩论。
问题是……如何确保 localhost 上的本地端口(我不能使用动态端口,所以它必须是静态的)没有被任何其他应用程序使用或监听?
我目前正在我的 C# 应用程序中执行此代码:
private bool checkPort(int port)
{
try
{
//Create a socket on the current IPv4 address
Socket TestSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// Create an IP end point
IPEndPoint localIP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port);
// Bind that port
TestSocket.Bind(localIP);
// Cleanup
TestSocket.Close();
return false;
}
catch (Exception e)
{
// Exception occurred. Port is already bound.
return true;
}
}
我目前在 for 循环中从特定端口开始调用此函数,以在第一个可用端口获得“假”返回。我尝试的第一个端口实际上是由 uTorrent 监听的。上面的代码没有捕捉到这一点,我的连接失败了。
确保端口真正空闲的最佳方法是什么?我确实了解其他一些程序可能会在我测试期间/之后抢占该端口。我只需要找到一些东西,以确保在执行测试时它当前根本不在使用中。
如果有办法在测试期间真正保留 localhost 端口,我很想听听。
【问题讨论】:
-
想知道我是否应该为此离开 Putty 并使用 SharpSSH。还有其他适用于 c#/vb 的好的 SSH 源代码吗?
标签: networking network-programming c#-4.0 network-protocols