判斷Socket連線是否斷線

判斷Socket連線是否斷線

這篇介紹在TCP/IP Protocol中,C#如何偵測Socket是否斷線。

Socket.Connected

1
2
3
4
5
6
7
使用Socket.Connected檢查連線狀態,但若在測試時直接關閉連線或結束程式,程式並不會偵測到已經斷線的事實!

Connected 屬性會取得上次 I/O 作業的 Client 通訊端連接狀態。當它傳回 false 時,即表示 Client 通訊端不是從未連接過,就是不再連接了。

因為 Connected 屬性只反映最近一次作業的連接狀態,所以您應嘗試傳送或接收訊息,以判斷目前的狀態。
訊息傳送失敗之後,這個屬性就不再傳回 true。請注意,這種行為是設計上的預期行為。您可能無法很穩定地測試連接的狀態,
原因是有可能在測試和收發 (訊息) 之間就失去該連接。您的程式碼應假設該通訊端是連接的,然後再小心處理傳輸失敗的情況。

socket.Poll and SocketFlags.Peek example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if (socket.Connected && !checkSocketConnection(socket))
{
//To Do Something
}

public bool checkSocketConnection(Socket socket)
{
bool closed = false;
try
{
//使用Peek測試連線是否仍存在
if (socket.Poll(0, SelectMode.SelectRead))
closed = socket.Receive(new byte[1], SocketFlags.Peek) == 0;
}
catch (SocketException ex)
{
LogUtil.logger.Info("(EndRead)checkSocketConnection SocketException" + ex.ToString());
closed = true;
}
return closed;
}