如何在不使用輪詢的情況下檢查非阻塞套接字是否斷開連接?C#檢查套接字是否斷開連接?
6
A
回答
5
創建cusomt插座類繼承.NET套接字類:
public delegate void SocketEventHandler(Socket socket);
public class CustomSocket : Socket
{
private readonly Timer timer;
private const int INTERVAL = 1000;
public CustomSocket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType)
: base(addressFamily, socketType, protocolType)
{
timer = new Timer { Interval = INTERVAL };
timer.Tick += TimerTick;
}
public CustomSocket(SocketInformation socketInformation)
: base(socketInformation)
{
timer = new Timer { Interval = INTERVAL };
timer.Tick += TimerTick;
}
private readonly List<SocketEventHandler> onCloseHandlers = new List<SocketEventHandler>();
public event SocketEventHandler SocketClosed
{
add { onCloseHandlers.Add(value); }
remove { onCloseHandlers.Remove(value); }
}
public bool EventsEnabled
{
set
{
if(value)
timer.Start();
else
timer.Stop();
}
}
private void TimerTick(object sender, EventArgs e)
{
if (!Connected)
{
foreach (var socketEventHandler in onCloseHandlers)
socketEventHandler.Invoke(this);
EventsEnabled = false;
}
}
// Hiding base connected property
public new bool Connected
{
get
{
bool part1 = Poll(1000, SelectMode.SelectRead);
bool part2 = (Available == 0);
if (part1 & part2)
return false;
else
return true;
}
}
}
然後使用它是這樣的:
var socket = new CustomSocket(
//parameters
);
socket.SocketClosed += socket_SocketClosed;
socket.EventsEnabled = true;
void socket_SocketClosed(Socket socket)
{
// do what you want
}
我剛剛實施了每個插座套接字關閉事件。所以你的應用程序應該爲這個事件註冊事件處理程序。那麼套接字會通知你的應用程序,如果它本身是關閉的;)
如果代碼有問題,通知我。
0
Socket
類有一個Connected
屬性。根據MSDN,檢查呼叫是非阻塞的。這不是你想要的嗎?
+0
這是輪詢解決方案 – 2011-04-18 04:38:26
+0
連接屬性似乎總是如此,除非我自己斷開套接字。我只是檢查,即使套接字被遠程服務器斷開,它仍然返回true。 – Will 2011-04-18 04:39:22
相關問題
- 1. 檢測套接字斷開連接
- 2. Python 3.5.1 - Asyncio - 檢查套接字客戶端是否已斷開連接
- 3. 如何檢測C中的套接字斷開連接#
- 4. java tcp套接字檢查客戶端斷開連接
- 5. C#:套接字問題 - 幾秒鐘後連接的套接字斷開連接
- 6. c#套接字檢查連接
- 7. 無法斷開連接並重新連接套接字(C++,winsock2)
- 8. 檢測套接字斷開?
- 9. 檢查套接字連接
- 10. 模擬套接字斷開連接
- 11. php mysql斷開連接是否真的斷開連接?
- 12. C++檢測客戶端是否關閉連接(多套接字)
- 13. php套接字服務器檢查客戶端是否連接
- 14. 中斷連接套接字
- 15. nodejs websocket檢測斷開連接套接字
- 16. 在WCF中檢測套接字斷開連接
- 17. Windws C++間歇性套接字斷開連接
- 18. C STREAM客戶端套接字在斷開連接後重用
- 19. 重新連接斷開連接的客戶端套接字
- 20. 檢查ADODB連接是否打開
- 21. C++ TCP檢測客戶端是否已斷開連接數秒
- 22. Golang:如何檢查會話是否連接/斷開
- 23. 如何異步檢查客戶端是否斷開連接?
- 24. 檢查用戶是否使用Flask斷開連接
- 25. 如何檢查客戶端是否已斷開連接?
- 26. 檢查PHP套接字服務器中的斷開連接客戶端
- 27. Perl套接字連接檢查
- 28. 檢查套接字連接或不
- 29. C(Linux)檢查套接字
- 30. 如何檢測套接字斷開?
Socket.Connected不可實現 – Will 2011-04-18 04:48:33
在自定義類中實現的新的關聯屬性。嘗試一下,它會奏效。 – 2011-04-18 04:53:02
Poll方法在linux上不起作用。即使套接字已關閉,它仍會繼續返回false。這就是爲什麼我正在尋找一種不使用投票的方式。 – Will 2011-04-18 05:01:09