如果我的套接字已连接且未关闭,为什么要发送RST?

use*_*117 6 sockets android tcp

我有一个Android设备,使用java.net.Socket与PC无线通信.一切都很好,但如果我没有做任何事情(即没有网络使用)正好1分钟,那么当Android向PC发送数据包时,PC会收到它并发送一个ACK,但Android会以RST响应.

来自Wireshark(10.1.2.1是Android,10.1.2.11是PC)......

356 0.112470 10.1.2.1 10.1.2.11 TCP 97 34360→181 [PSH,ACK] Seq = 1 Ack = 1 Win = 4935 Len = 31 TSval = 156103571 TSecr = 320673352

359 0.000011 10.1.2.11 10.1.2.1 TCP 66 181→34360 [ACK] Seq = 1 Ack = 32 Win = 260 Len = 0 TSval = 320738236 TSecr = 156103571

360 0.000304 10.1.2.1 10.1.2.11 TCP 60 34360→181 [RST] Seq = 32 Win = 0 Len = 0

在这一点上,如果我询问套接字的成员变量,它说...

  • isConnected = true
  • isCreated = true
  • isInputShutdown = false
  • isOutputShutdown = false
  • isClosed = false
  • isBound = true

...看起来我应该仍然接收数据包就好了. 那我怎么弄清楚我发送RST的原因呢?

注意 - 没有设置"睡眠"或关闭wifi或显示器或此设备上启用的任何其他节电功能设置.

use*_*421 1

这些Socket方法都不返回连接状态。它们都是关于对象的内部状态java.net.Socket 由您调用的构造函数和方法决定。false如果对等方断开连接,它们不会神奇地开始返回。

您会发现,当您使用I /O 套接字时,您将获得一个IOException: 'connection reset'.

为什么连接被重置是另一回事。通常的原因是您发送到的连接已被对等方关闭,或者对等方在没有读取所有已到达的数据的情况下关闭了连接。换句话说,应用程序协议错误。还有其他原因,但这些是最常见的。