我寫了一個tcp服務器,每次接受客戶端連接時,由Accept
或EndAccept
返回的套接字實例被稱爲處理程序和許多其他信息收集在名爲TcpClientConnection
的對象中,我需要確定是否連接是否連接或在某些特定間隔時間,Socket.Connected
屬性是不可靠的,根據文檔我應該使用Poll
方法與SelectRead
選項來執行此操作。 與測試場景我拔掉客戶端電纜,並等待破損的報警建立在handler.Poll(1, SelectMode.SelectRead)
上,它應該返回true,但從未發生過。確定TCP服務器中的斷開連接
0
A
回答
1
根據Socket.Poll的文檔:
這種方法不能檢測某些種連接問題,例如一個破碎網絡電纜,或遠程主機被非正常關閉。您必須嘗試發送或接收數據以檢測這些類型的錯誤。
換句話說 - 輪詢對於檢查是否有數據到達並可用於本地OS網絡堆棧很有用。 如果你需要檢測連接問題,你需要調用阻塞讀取(例如Socket.Receive
)
你也可以建立一個簡單的初始化miniprotocol來交換一些同意的'hello'來回消息。 下面是一個簡單的例子,你可以怎麼做:
private bool VerifyConnection(Socket socket)
{
byte[] b = new byte[1];
try
{
if (socket.Receive(b, 0, 1, SocketFlags.None) == 0)
throw new SocketException(System.Convert.ToInt32(SocketError.ConnectionReset));
socket.NoDelay = true;
socket.Send(new byte[1] { SocketHelper.HelloByte });
socket.NoDelay = false;
}
catch (Exception e)
{
this._logger.LogException(LogLevel.Fatal, e, "Attempt to connect (from: [{0}]), but encountered error during reading initialization message", socket.RemoteEndPoint);
socket.TryCloseSocket(this._logger);
return false;
}
if (b[0] != SocketHelper.HelloByte)
{
this._logger.Log(LogLevel.Fatal,
"Attempt to connect (from: [{0}]), but incorrect initialization byte sent: [{1}], Ignoring the attempt",
socket.RemoteEndPoint, b[0]);
socket.TryCloseSocket(this._logger);
return false;
}
return true;
}
1
這是順便把TCP和IP協議的工作從根本上造成的。檢測連接是否斷開的唯一方法是通過連接發送一些數據。基礎的TCP協議將使得確認從接收器發送回發送者,從而允許檢測到斷開的連接。
這些文章提供一些更多的信息
+0
感謝您的鏈接 – AhmadAli
相關問題
- 1. SQL服務器定期斷開連接
- 2. 如何在netty中斷開連接後自動連接到TCP服務器
- 3. boost :: asio tcp服務器斷開連接問題
- 4. Android tcp客戶端連接,然後從java服務器斷開連接
- 5. TCP連接斷開檢測(如果中間連接斷開)?
- 6. psycopg2與服務器斷開連接
- 7. 如何連接/斷開服務器?
- 8. 強制斷開TCP連接
- 9. Linux的TCP服務器:接受連接
- 10. 從服務器TCP斷開客戶
- 11. TCP服務器斷開/電纜拔出
- 12. 檢查Java TCP服務器上的客戶端斷開連接 - 僅輸出
- 13. 連接到扭曲的TCP服務器
- 14. Android服務器啓動的TCP連接
- 15. Javascript到服務器的TCP連接
- 16. 客戶端在連接到節點js後立即斷開TCP服務器
- 17. python httplib和斷開的tcp連接
- 18. Julia TCP服務器和連接
- 19. JAVA TCP客戶端 - 服務器連接
- 20. TCP服務器連接復位
- 21. TCP連接VS ping服務器
- 22. TCP服務器關閉連接
- 23. 用於服務器到服務器連接的單個持久性TCP連接
- 24. 「連接中斷」一asp.net服務器
- 25. 如何檢測Thrift中的服務器斷開連接?
- 26. 從服務器端列表中刪除斷開連接的MarshalByRefObjects
- 27. 客戶端斷開連接時,服務器不會移除/斷開套接字
- 28. 異步套接字連接,服務器斷開連接時,客戶端GUI掛起TCP通信
- 29. 確定tcp連接狀態
- 30. Java連接池不限制向DB服務器打開的TCP連接數
你能否提供一些代碼? – Henningsson