如何从 TCP 访问有关网络的信息?

How to access information about network from TCP?

我正在Java写一个应用层协议。它基本上只是传输文件。如果传输无法完成或客户端与服务器之间的连接中断,我希望它生成错误消息。

有没有办法从 TCP 获取有关连接或传输状态的信息?或者我是否需要依赖我在应用程序层使用的东西?如果我可以从 TCP 访问信息,怎么做?

TCP 不知道传输的 "status"。这是应用程序协议问题,而不是传输层问题。

至于TCP连接状态,没办法直接查询。相反,您会在尝试读取或写入数据时发现状态。 read(...) 或 `write(...) 的结果给出了一些关于连接状态的信息..

  • 如果 readwrite 调用指示它已读取或写入非零字节数,则连接可能处于活动状态。

  • 如果一个read即returns零字节表示另一端已经关闭了他们的写端连接。但是,我们无法确定是远程应用程序执行了该操作,远程 OS 执行了该操作,还是网络中的某些内容启动了关闭。

  • 如果 readwrite 抛出异常,那么我们可以推断出发生了问题并且连接不再可行。在这种情况下可能存在的例外情况包括:

    • SocketException - 典型消息 "connection reset" 或 "pipe broken" 通常表示远程执行了意外操作,或 "socket closed" 表示应用程序已尝试读取或在 关闭的连接上写入。
    • SocketTimeoutException - 通常,如果 read 花费的时间比为套接字配置的读取超时时间长,就会发生这种情况。不幸的是,它无法告诉您有关超时的根本原因的任何信息。
    • ProtocolException - 这在理论上对于套接字 i/o 操作是可能的,但此异常通常由应用程序协议代码抛出。

不幸的是,这意味着很难向您的应用程序用户提供有关传输失败原因的清晰准确的信息。但这是网络连接所固有的。真正的问题是简单/明确的诊断信息无法直接获得 anywhere.