【问题标题】:How does control flow after socket close?socket关闭后控制流程如何?
【发布时间】:2021-09-06 04:16:19
【问题描述】:
//pseudo code - actual code in c++
Process P1 code:
func handle_close() {
   print "close";
}

func sayhello() {
    print "hello";
}

func writeonsocketforP2() {
   write(fd, somedata, somedata_sz);
}

func WriteToP2() {
    count = 0;
    while (count++ != 1000000) writeonsocketforP2();
    sayhello();
}

考虑场景:

  1. 进程 P1(单线程)和 P2 之间建立的套接字连接
  2. P1 在循环中从 WriteToP2 函数向 P2 的套接字写入大量数据
  3. P2 在 P1 仍在写入时发生故障,并且 P1 获得了套接字关闭事件并调用了关闭事件处理程序 handle_close..let 说这发生在计数为 1000 时
  4. handle_close 被调用后,控制是否会返回 while 循环并从计数 1001 继续 while 循环?
  5. 在 WriteToP2 的 while 循环中间套接字关闭后会调用 sayhello()

【问题讨论】:

  • @Scheff'sCat 是的..伪代码...c ++中应用程序的实际代码..已编辑以发表评论

标签: c++ sockets event-handling network-programming


【解决方案1】:

这就是为什么您需要检查write() 是否返回写入套接字的错误代码(假设像TCP 这样的面向连接的套接字)。 write() 返回 -1 如果在写入套接字时发生错误,其中包括关闭的套接字。

此外,在您的代码中,sayhello() 在循环结束之前不会被调用。通常WriteToP2() 需要另一个线程,除非您可以编写非阻塞代码。

【讨论】:

  • 旁注:如果 P2 在没有握手的情况下发生故障,即使进行了适当的错误检查,也可能需要一段时间才能意识到这一点。 write 在发送窗口填满之前不会开始失败。
  • @user4581301 你的意思是在连接握手之前?是的,但在那种情况下connect 返回错误(经过很长时间),我们根本不应该write
  • 不,我的意思是连接后。连接成功,开始发送数据,对方没有关闭连接就消失了。 TCP 将在很长一段时间内一直尝试将写入堆栈的任何内容发送到堆栈,并允许write 继续添加直到窗口已满。 TCP 生存机制的一部分。
  • @user4581301 是的,这是真的。但对此无能为力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 2012-05-02
  • 2011-12-28
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多