c#插座检查连接
本文关键字:连接 检查 插座 | 更新日期: 2023-09-27 18:29:25
我正在尝试建立一个到特定端口的主机/ip地址的套接字连接
- 获取booth成功/失败连接的响应时间(以毫秒为单位)
- 使用自定义超时,例如5秒(5000)
所以,基本上,如果我指定一个主机名,比如google.com
和端口80
,这应该检查连接是否正常,如果我选择173.194.70.101
和端口80
,它也应该正常。
例如,如果我指定主机名(如google.com
和端口7788
),这将不起作用,因为该端口未打开。如果我指定IP:173.194.70.101
和端口"7788",这应该不起作用。
如果我指定一些随机主机,如sdfzsdfaklsf.com
和端口7788
,这应该不起作用,因为该主机不存在。
对于以上所有情况,我需要所有成功/失败的响应时间。。。
我最终得到了这个代码和接缝,可以很好地工作,但我想问一下,这是否是一种正确的方法?
public string CheckConnection(string ipAddressOrHostName, string portName)
{
Stopwatch timer = new Stopwatch();
timer.Start();
Socket server = null;
string elapsed = string.Empty;
try
{
IPHostEntry hostEntry = Dns.GetHostEntry(ipAddressOrHostName);
IPAddress ipAddress = hostEntry.AddressList[0];
IPEndPoint ip = new IPEndPoint(ipAddress, Convert.ToInt32(portName));
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IAsyncResult result = server.BeginConnect(ip, null, null);
result.AsyncWaitHandle.WaitOne(5000, true);
timer.Stop();
elapsed = timer.ElapsedMilliseconds.ToString();
if (!server.Connected)
{
server.Close();
throw new Exception();
}
else
{
string status = string.Format("Connected succesfully to: {0} in: {1} milliseconds", server.RemoteEndPoint.ToString(), elapsed);
server.Shutdown(SocketShutdown.Both);
server.Close();
return status;
}
}
catch (Exception)
{
timer.Stop();
elapsed = timer.ElapsedMilliseconds.ToString();
return string.Format("Connection failed to: {0}:{1} in: {2} milliseconds", ipAddressOrHostName, portName, elapsed);
}
}
非常不错。几点:
- 捕获一个特定类型的异常并进行测试。您不想捕获不相关的东西或隐藏bug
- 在完成DNS解析后启动计时器
throw new Exception
不太好,因为异常并不意味着控制流。重新构造方法以不需要此破解- 您可能希望使用任务而不是
IAsyncResult
。没有功能变化,只是更现代的风格 - 您在一些地方有冗余(例如重复关闭、重复ToString)
- 分析方法外部的端口。它不属于那里。事实上,如果端口是不可解析的,您将在此时触发感知超时,因为将引发异常。这就是我对第(1)点的警告。过多地使用异常导致了一个你可能永远不会知道的错误,因为它是隐藏的