2011-01-03 41 views
13

Tôi thử kiểm tra kết nối TCP bằng mã sau.Làm cách nào để đặt thời gian chờ kết nối TCP thử nghiệm?

System.Threading.Thread t = new System.Threading.Thread(() => 
{  
    using (TcpClient client = new TcpClient()) 
    { 
     client.Connect(ip, Convert.ToInt32(port)); 
    } 
}); 
t.Start(); 

Cách đặt thời gian chờ nếu IP hoặc cổng không hợp lệ?

+5

[Nó có vẻ như không có cách nào tốt để làm điều đó.] (Http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/2281199d-cd28-4b5c-95dc -5a888a6da30d /) –

+0

Không thể. Thời gian chờ chỉ có thể được điều chỉnh cho các hoạt động gửi. Đó là ofcourse có thể thực hiện cơ chế thời gian chờ của riêng bạn nhưng bạn không thể đạt được giá trị thời gian chờ lâu hơn. – Mervin

Trả lời

15

Không có cách nào được xây dựng để thực hiện việc này. Tôi sử dụng mã sau cho nhiều ứng dụng của chúng tôi. Mã không có nghĩa là ban đầu nhưng hoạt động tốt. Xin lưu ý rằng bạn có thể phải thêm lần thử lại vào chức năng này ... đôi khi nó trả về false ngay cả khi máy chủ đang hoạt động.

private static bool _TryPing(string strIpAddress, int intPort, int nTimeoutMsec) 
    { 
     Socket socket = null; 
     try 
     { 
      socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, false); 


      IAsyncResult result = socket.BeginConnect(strIpAddress, intPort, null, null); 
      bool success = result.AsyncWaitHandle.WaitOne(nTimeoutMsec, true); 

      return socket.Connected; 
     } 
     catch 
     { 
      return false; 
     } 
     finally 
     { 
      if (null != socket) 
       socket.Close(); 
     } 
    } 
+0

Xin chào, tôi có 2 câu hỏi cho mã: 1. Đối với biến thành công không được sử dụng là gì dự định sẽ được sử dụng? 2. nếu tôi thử ví dụ mã của bạn, tôi nhận được một ObjectDisposedException ngay sau khi socket.Close(). nó có thể là gì? – Offler

+0

Biến thành công không sử dụng được ... tôi chỉ lấy các phần mã mà tôi đang làm việc làm ví dụ. Ý tưởng chung ở đây là bạn bắt đầu một kết nối không đồng bộ và đợi cho đến khi kết nối thành công hoặc hết thời gian. Sau đó bạn kiểm tra trạng thái kết nối của ổ cắm. – Saibal

10

Không có cách trực tiếp để đạt được nó, nhưng một cách để làm điều đó có thể là có một phương pháp riêng biệt mà sẽ kiểm tra kết nối.

static bool TestConnection(string ipAddress, int Port, TimeSpan waitTimeSpan) 
     { 
      using (TcpClient tcpClient = new TcpClient()) 
      { 
       IAsyncResult result = tcpClient.BeginConnect(ipAddress, Port, null, null); 
       WaitHandle timeoutHandler = result.AsyncWaitHandle; 
       try 
       { 
        if (!result.AsyncWaitHandle.WaitOne(waitTimeSpan, false)) 
        { 
         tcpClient.Close(); 
         return false; 
        } 

        tcpClient.EndConnect(result); 
       } 
       catch (Exception ex) 
       { 
        return false; 
       } 
       finally 
       { 
        timeoutHandler.Close(); 
       } 
       return true; 
      } 
     } 

Phương pháp này sẽ sử dụng một WaitHandle rằng sẽ chờ đợi trong khoảng thời gian quy định để có được kết nối thành lập, nếu nó được kết nối trong thời gian, nó sẽ đóng kết nối và trở thành sự thật, nếu không, nó sẽ timeout và trở lại sai.

+0

Phương pháp này thực sự không tuyệt vời vì có thể tạo ra lỗi kết nối. http://social.msdn.microsoft.com/Forums/en-US/313cf28c-2a6d-498e-8188-7a0639dbd552/tcpclientbeginconnect-issue –

8

Quá muộn để sử dụng cho OP nhưng đối với bất kỳ ai khác vẫn tìm trang này từ tìm kiếm, bạn có thể giải quyết vấn đề này bằng các tính năng lập trình không đồng bộ được giới thiệu trong .Net 4.5.

var hostname = "127.0.0.1"; 
var port = 123; 
var timeout = TimeSpan.FromSeconds(3); 
var client = new TcpClient(); 
if (!client.ConnectAsync(hostname, port).Wait(timeout)) 
{ 
    // timed out 
} 
+0

Điều này hoạt động nhưng phương pháp Chờ khóa chủ đề. – ozziwald

Các vấn đề liên quan