【问题标题】:How should I cleanly break out of a recv loop?我应该如何干净利落地跳出 recv 循环?
【发布时间】:2011-11-28 04:37:13
【问题描述】:

我在循环中使用recv 函数来接收网络数据,但假设我想在循环中停止接收数据。我可以打破循环,但这似乎不是一种非常干净的方法来停止接收数据。

那么有什么方法可以完全停止接收数据,或者只是打破循环好吗?这是 HTTP GET/POST 请求。

这是我正在使用的简化版:

do {
  nDataLen = recv(mySocket, data, BUFFSIZE, 0);
  if (nDataLen > 0)
  {
    /* Process Data */
    // I'd like to break out of the loop
    // if something is found when processing the data
    // But, I want to do this cleanly.
  }
} while (nDataLen != 0);

【问题讨论】:

  • 我们可以看看你正在使用的代码吗?
  • “停止接收数据”是什么意思? recv 允许您从已接收到的网络缓冲区中提取数据,或等待直到接收到一些数据。如果你不调用recv,那并不意味着没有接收到数据。它仍然会进入某个系统缓冲区。
  • @VaughnCato 打破循环会有什么伤害吗?如果数据在某处的系统缓冲区中,它会在那里停留多长时间?
  • @Josh:不,那很好。它会一直留在那里,直到你使用另一个 recv() 或者你关闭套接字。

标签: c++ c networking recv


【解决方案1】:

跳出 recv 循环不会关闭连接。所发生的一切是您停止调用 recv 并因此停止从套接字读取数据。来自对等方的数据仍将到达您的套接字。如果你想彻底关闭,请在套接字文件描述符上调用close

【讨论】:

    【解决方案2】:

    跳出循环是停止调用recv 的一种方式。另一种方法是包含一个布尔值should_stop 并在循环条件中检查它。但是,您应该收到套接字中剩余的任何内容并正确关闭它。

    【讨论】:

      【解决方案3】:

      如果您不需要套接字,请关闭套接字并跳出循环。

      【讨论】:

        猜你喜欢
        • 2012-11-28
        • 1970-01-01
        • 2015-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多