我写了一个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