如何使用C#测试TCP连接,给定服务器的IP地址和端口?

17

如何使用 C# 编写代码,程序化地确定我是否具有连接到指定 IP 地址和端口的服务器(TCP)的权限?


2
有必要进行一些澄清。 "access" 是什么意思?您是否尝试连接目标计算机上的特定端口? - Luke
我已经更新了问题,使其更具体(给定IP+端口的TCP访问)。 - Ambrose Leung
4个回答

20

你可以使用Ping类(.NET 2.0及以上版本)

    Ping x = new Ping();
    PingReply reply = x.Send(IPAddress.Parse("127.0.0.1"));
if(reply.Status == IPStatus.Success) Console.WriteLine("地址可访问");

在生产系统中,您可能想使用异步方法来允许取消等操作。


5
这篇文章得到了很多赞,但并非适用于所有服务器。对我而言,它无法运行。http://security.stackexchange.com/questions/4440/security-risk-of-ping 通常会在公开可见的服务器上禁用或阻止Ping - teynon
即使我关闭服务器(NodeJS),ping仍然成功。 - Sid133

16

假设您的意思是通过TCP套接字:

IPAddress IP;
if(IPAddress.TryParse("127.0.0.1",out IP)){
    Socket s = new Socket(AddressFamily.InterNetwork,
    SocketType.Stream,
    ProtocolType.Tcp);

    try{   
        s.Connect(IPs[0], port);
    }
    catch(Exception ex){
        // something went wrong
    }
}

更多信息请参考:http://msdn.microsoft.com/en-us/library/4xzx2d41.aspx?ppud=4


2
在声明时创建的IP实例将永远不会被使用,因为它立即作为输出参数传递,而该参数将始终在调用的方法内部被替换。因此,我会省略实例化。但是,如果不将IP.TryParse更改为IPAddress.TryParse(它是一个静态方法),则无法这样做。因此,我也会进行更改。 - user1132959
将IP [0]更改为仅IP。 - user5583316

12

声明字符串地址和整型端口,然后您就可以通过TcpClient类进行连接。

System.Net.Sockets.TcpClient client = new TcpClient();
try
{
    client.Connect(address, port);
    Console.WriteLine("Connection open, host active");
} catch (SocketException ex)
{
    Console.WriteLine("Connection could not be established due to: \n" + ex.Message);
}
finally
{
    client.Close();
}

-4

这应该可以做到

bool ssl;
ssl = false;
int maxWaitMillisec;
maxWaitMillisec = 20000;
int port = 555;

success = socket.Connect("Your ip address",port,ssl,maxWaitMillisec);


if (success != true) {

    MessageBox.Show(socket.LastErrorText);
    return;
}

4
你是在哪里定义socket的?这段代码片段是不完整的。 - Mixxiphoid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接