ऐसा लगता है कि लंबे समय से देरी करने वाले सभी मामलों का समाधान काफी किया जा सकता है इस तरह सीधे सॉकेट कनेक्शन का प्रयास करके अधिक तेज़ी से:
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);
}
}
मैं इस कोड का उपयोग यह जांचने के लिए करने जा रहा हूं कि सर्वर SQL सर्वर पोर्ट पर प्रतिक्रिया करता है या नहीं, और यदि ऐसा होता है तो केवल कनेक्शन खोलने का प्रयास करें। मैंने सोचा (दूसरों के अनुभव के आधार पर) कि इस स्तर पर भी 30 सेकंड की देरी होगी, लेकिन मुझे एक संदेश मिलता है कि मशीन ने तुरंत इन पर "कनेक्शन को सक्रिय रूप से मना कर दिया"।
संपादित करें: और अगर मशीन मौजूद नहीं है, तो वह मुझे वह भी तुरंत बता देती है। कोई 30-सेकंड की देरी नहीं जो मुझे मिल सकती है।
संपादित करें: ऐसी मशीनें जो नेटवर्क पर थीं लेकिन बंद नहीं हुईं, मुझे लगता है कि विफल होने में अभी भी 30 सेकंड लगते हैं। हालांकि, फायरवॉल मशीनें तेजी से विफल हो जाती हैं।
संपादित करें: यहाँ अद्यतन कोड है। मुझे लगता है कि थ्रेड को निरस्त करने की तुलना में सॉकेट को बंद करना अधिक स्वच्छ है:
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);
}
}