【问题标题】:c++ check for TCP window full?c ++检查TCP窗口是否已满?
【发布时间】:2016-08-11 19:28:02
【问题描述】:

我正在编写一个在 Linux 上运行的 c++ 服务器应用程序。 iOS 客户端应用程序打开到服务器的 TCP 连接,服务器开始在连接上发送消息。 当 iOS 应用程序置于后台时,例如通过用户切换到另一个应用程序,应用程序停止从套接字读取数据,但套接字在 iOS 中仍处于打开状态。服务器一直发送直到缓冲区窗口已满,然后在 send() 调用中挂起。 有没有办法在调用之前检测到 send() 调用会挂起?或者一种在通话挂起时退出通话的方法,例如设置超时?

【问题讨论】:

    标签: c++ linux sockets tcp


    【解决方案1】:

    您可以将发送套接字设置为非阻塞模式。

    使用fcntl()F_SETFL 套接字上的O_NONBLOCK 标志。

    您正确编写的代码应该已经在检查来自send() 的返回值,因为即使使用阻塞套接字send() 也可能表明写入的字节数少于请求的字节数。

    在非阻塞模式下,send() 将立即返回,返回值为 -1,errno 等于 EAGAINEWOULDBLOCK。然后,使用poll()select() 来检查socket 何时可以写入next。

    【讨论】:

    • send() 将立即返回 error,如果没有写入任何字节,则返回代码为 -1。它可以返回零的唯一方法是您提供零长度。
    【解决方案2】:

    将套接字置于非阻塞模式并检测EAGAIN/EWOULDBLOCK

    【讨论】:

      【解决方案3】:

      您可以使用简单的selectpoll,超时时间为零,并将单个套接字用作写入文件描述符/句柄。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-09
        • 2017-09-14
        • 2012-12-28
        • 2012-09-02
        • 2014-10-23
        • 1970-01-01
        相关资源
        最近更新 更多