我正在尝试为特定端口建立到主机/ IP地址的套接字连接。我试图实现的主要内容是:
所以基本上如果我指定一个主机名如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);
}
}
答案 0 :(得分:2)
非常好。几点:
throw new Exception
不太好,因为异常不是指控制流。重构方法不需要这个黑客。IAsyncResult
。没有功能变化,只是更现代的风格。