簡體   English   中英

C#TcpClient超時

[英]C# TcpClient Timeout

我試圖連接到本地網絡內的路由器。 到目前為止,我已經使用了TcpClient。

檢查我的代碼:

public static void RouterConnect()
        {    
            TcpClient tcpClient = new TcpClient("192.168.180.1",23); <-- Timeout comes up here
            tcpClient.ReceiveTimeout = 2000; // Not working
            tcpClient.SendTimeout = 2000; // Also not working
            NetworkStream nStream = tcpClient.GetStream(); <-- thought Timeout would raise here

            // Further code here. But already tested while commented out. 
            // So everything else expect the code above shouldnt be relevant.
        }

我想添加一個設置表單(router-ip / user / password)。 因此,在用戶端,如果用戶鍵入不存在的host-ip,可能會出現故障。

當前超時大約是20秒 ,這太高了。 TcpClient.ReceiveTimeoutTcpClient.SendTimeout設置了正確的超時設置,因為我已經嘗試過了。 Google並沒有幫助我。

因此,誰知道該如何以正確的方式設置超時時間? 我已經了解了異步。 我不想使用的連接。 更干凈的1行超時設置會很好。 可能?

非常感謝!

編輯1:在調試時仔細觀察,我發現tcpClient的初始化超時已經提高了(如我在上面的代碼中編輯的),而不是我以前在.GetStream()想的。


編輯解決方案:

由於沒有人發布我選擇的解決方案中的工作代碼,因此它的工作方式如下:

public static void RouterConnect()
        {
            TcpClient tcpClient = new TcpClient();
            if(tcpClient.ConnectAsync("192.168.80.1",23).Wait(TimeSpan.FromSeconds(2)))
            {
                NetworkStream nStream = tcpClient.GetStream();
            }
            else
            {
                MessageBox.Show("Could not connect!");
            }
        }

我知道的唯一方法是使用異步方法。 .Net 4.5中有一個不錯的新異步方法,它返回一個可以等待的Task,如下所示:

tcpClient.ConnectAsync().Wait(timeout)

如果不成功,則返回false。

是的,我想最干凈的方法是使用TcpClient .BeginConnect方法。

因此,無論是否可以連接到端點,您都會收到異步反饋。 另請參見: 異步連接

您正在使用的當前構造函數重載方法也正在連接,因此將您阻塞,直到連接為止。

此外TcpClient上沒有用於控制TcpClient超時的屬性。

MSDNTcpClient(String, Int32)

初始化TcpClient類的新實例,並連接到指定主機上的指定端口。

來自MSDN的替代代碼

using (vartcp = new TcpClient())  
{  
    IAsyncResult ar = tcp.BeginConnect("192.168.180.1", 23, null, null);  
    System.Threading.WaitHandle wh = ar.AsyncWaitHandle;  
    try 
    {  
       if (!ar.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(2), false))  
       {  
           tcp.Close();  
           throw new TimeoutException();  
       }  

        tcp.EndConnect(ar);  
    }  
    finally 
    {  
        wh.Close();  
    }  
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM