提前感谢您的建议。
我目前正在开发一个程序,该程序使用Putty与服务器建立SSH连接,该服务器使用本地端口转发来启用运行我的软件的客户端,以通过localhost访问SSH服务器后面的服务。
IE:客户:20100 - >互联网 - >通过路由器/防火墙公开的远程SSH服务器 - >本地内联网 - > Intranet Web POP3服务器:110。
Cmd Line:“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#app中执行此代码:
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循环中的特定端口开始,以在第一个可用端口获得'false'返回。我尝试的第一个端口实际上是由uTorrent听取的。上面的代码没有捕到这个,我的连接失败了。
确保端口真正免费的最佳方法是什么?我确实理解其他一些程序可能会在测试期间/之后抓住端口。我只需要找到一些能够确保在执行测试时当前没有使用的东西。
如果在测试期间有办法真正保留localhost端口,我很乐意听到它。
答案 0 :(得分:3)
Here's如何检查本地端口是否空闲的答案。
我会这样推荐:
bool IsBusy(int port)
{
IPGlobalProperties ipGP = IPGlobalProperties.GetIPGlobalProperties();
IPEndPoint[] endpoints = ipGP.GetActiveTcpListeners();
if ( endpoints == null || endpoints.Length == 0 ) return false;
for(int i = 0; i < endpoints.Length; i++)
if ( endpoints[i].Port == port )
return true;
return false;
}