判斷Socket是否連接上,需要通過發包來確認。
之前確認都是調用調用socket的connected屬性,然而該屬性是上次的連接是否成功的結果,不及時。
// 檢查一個Socket是否可連接
private bool IsSocketConnected(Socket client)
{
bool blockingState = client.Blocking;
try
{
byte[] tmp = new byte[1];
client.Blocking = false;
client.Send(tmp, 0, 0);
return true;
}
catch (SocketException e)
{
// 產生 10035 == WSAEWOULDBLOCK 錯誤,說明被阻止了,但是還是連接的
if (e.NativeErrorCode.Equals(10035))
return false;
else
return true;
}
finally
{
client.Blocking = blockingState; // 恢復狀態
}
}