首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测TCP连接丢失的时间

问检测TCP连接丢失的时间
EN

Stack Overflow用户
提问于 2016-10-14 16:32:27
回答 2查看 739关注 0票数 1

我想知道TCP连接何时丢失(未关闭),例如当服务器意外关闭时。所以我用outputStream.write(S)发送数据;当连接丢失时,我m trying send data it should throwsSocketException`。但它只在第二次发送数据后抛出。为什么会发生这种情况。

代码语言:javascript
复制
  void send_socket(){
            try{

                outputStream = socket.getOutputStream();
                outputStream.write(MSG.getBytes());

            }  catch (SocketException e){
                Log.e(TAG, "connection closed");
            }
            catch (IOException e){
                Log.e(TAG, "error 3 - ", e);
            }
    }
EN

回答 2

Stack Overflow用户

发布于 2017-01-07 17:48:50

检测TCP中的断开连接或拉入的最佳方式是等待IoException发生,然后采取适当的操作。TCP唯一能为您提供帮助的是,当对方发送最终返回-1的FIN并告诉用户连接已通过EOFException关闭时,我相信您现在已经发现了这一点。

编辑:感谢您的更正。我忘了说得更清楚一点。

票数 0
EN

Stack Overflow用户

发布于 2022-02-17 00:05:42

代码语言:javascript
复制
client                        server
======                        ======
         <-------FIN------    exit()/kill
          -------ACK------>

write()   -------PSH------>
         <-------RST------
          //RST is sent because FIN is already delivered

write()
//raise an error immediately due to RST

写一个已经有了FIN的套接字是正确的,然而,它会使做了一个完全关闭(这就是问题的情况)的对等体现在发送一个FIN发送一个RST。则第二次写入将立即引发错误,因为写入具有RST的套接字是错误的。这是TCP的本质。这就是为什么你必须发送两次才能知道服务器关闭的原因。

代码语言:javascript
复制
client                        server
======                        ======
         <-------FIN------    exit()/kill
          -------ACK------>

write()   -------PSH------>
         <-------RST------
          //RST is sent because FIN is already delivered
read()
//return 0 immediately due to FIN
//or return error ECONNRESET due to RST
代码语言:javascript
复制
client                        server
======                        ======
write()   -------PSH------>
         <-------ACK------
read()
//waits for response
         <-------FIN------    exit()/kill
          -------ACK------>
//return 0 immediately due to FIN

然而,程序通常是这样设计的(参见上面的两个插图),写入之后是读取。读取将返回0或错误,以指示服务器在服务器关闭后立即关闭。不需要写两次。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40038569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档