Có vẻ như tất cả các trường hợp gây ra sự chậm trễ kéo dài đều có thể được giải quyết nhiều nhanh hơn bằng cách thử kết nối ổ cắm trực tiếp như sau:
foreach (string svrName in args)
{
try
{
System.Net.Sockets.TcpClient tcp = new System.Net.Sockets.TcpClient(svrName, 1433);
if (tcp.Connected)
Console.WriteLine("Opened connection to {0}", svrName);
else
Console.WriteLine("{0} not connected", svrName);
tcp.Close();
}
catch (Exception ex)
{
Console.WriteLine("Error connecting to {0}: {1}", svrName, ex.Message);
}
}
Tôi sẽ sử dụng mã này để kiểm tra xem máy chủ có phản hồi trên cổng SQL Server hay không và chỉ cố gắng mở kết nối nếu có. Tôi đã nghĩ (dựa trên kinh nghiệm của những người khác) rằng sẽ có độ trễ 30 giây ngay cả ở mức này, nhưng tôi nhận được thông báo rằng máy "đã chủ động từ chối kết nối" ở mức này ngay lập tức.
Chỉnh sửa: Và nếu máy không tồn tại, nó cũng cho tôi biết điều đó ngay lập tức. Không có độ trễ 30 giây nào mà tôi có thể tìm thấy.
Chỉnh sửa: Máy đã vào mạng nhưng chưa tắt thì tôi đoán là mất 30 giây. Tuy nhiên, các máy có tường lửa nhanh hơn bị lỗi.
Chỉnh sửa: Đây là mã được cập nhật. Tôi cảm thấy đóng một ổ cắm sạch hơn là hủy bỏ một chuỗi:
static void TestConn(string server)
{
try
{
using (System.Net.Sockets.TcpClient tcpSocket = new System.Net.Sockets.TcpClient())
{
IAsyncResult async = tcpSocket.BeginConnect(server, 1433, ConnectCallback, null);
DateTime startTime = DateTime.Now;
do
{
System.Threading.Thread.Sleep(500);
if (async.IsCompleted) break;
} while (DateTime.Now.Subtract(startTime).TotalSeconds < 5);
if (async.IsCompleted)
{
tcpSocket.EndConnect(async);
Console.WriteLine("Connection succeeded");
}
tcpSocket.Close();
if (!async.IsCompleted)
{
Console.WriteLine("Server did not respond");
return;
}
}
}
catch(System.Net.Sockets.SocketException ex)
{
Console.WriteLine(ex.Message);
}
}