簡體   English   中英

如何在C#中進行非阻塞套接字調用以確定連接狀態?

[英]How do I make a non-blocking socket call in C# to determine connection status?

Socket上Connected屬性的MSDN文檔說明如下:

Connected屬性的值反映了最近操作時的連接狀態。 如果需要確定連接的當前狀態,請進行非阻塞,零字節發送調用。 如果調用成功返回或拋出WAEWOULDBLOCK錯誤代碼(10035),則套接字仍然連接; 否則,套接字不再連接。

我需要確定連接的當前狀態 - 如何進行非阻塞,零字節發送調用?

Socket.Connected屬性(至少.NET 3.5版本)的MSDN文檔底部的示例顯示了如何執行此操作:

// .Connect throws an exception if unsuccessful
client.Connect(anEndPoint);

// This is how you can determine whether a socket is still connected.
bool blockingState = client.Blocking;
try
{
    byte [] tmp = new byte[1];

    client.Blocking = false;
    client.Send(tmp, 0, 0);
    Console.WriteLine("Connected!");
}
catch (SocketException e) 
{
    // 10035 == WSAEWOULDBLOCK
    if (e.NativeErrorCode.Equals(10035))
        Console.WriteLine("Still Connected, but the Send would block");
    else
    {
        Console.WriteLine("Disconnected: error code {0}!", e.NativeErrorCode);
    }
}
finally
{
    client.Blocking = blockingState;
}

 Console.WriteLine("Connected: {0}", client.Connected);

只是根據經驗提供額外的信息: Socket.Connect文檔頁面版本3.5和4底部的注釋描述了我的經驗 - 這個例子根本不起作用。 真的希望我知道它為什么適用於某些人而不是其他人。

作為一種解決方法,盡管文檔說的是,我改變了樣本實際發送沒有標志的1字節。 這成功更新了Connected屬性的狀態,相當於每隔一段時間發送一個keep-alive數據包。

暫無
暫無

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

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