c ++检查TCP窗口是否已满?

时间:2016-08-11 11:08:13

标签: c++ linux sockets tcp

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

3 个答案:

答案 0 :(得分:1)

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

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

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

在非阻止模式下,send()会立即返回,返回值为-1,errno等于EAGAINEWOULDBLOCK。然后,使用poll()select()检查何时可以将套接字写入下一个。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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