我正在编写一个在Linux上运行的c ++服务器应用程序。 iOS客户端应用程序打开与服务器的TCP连接,服务器开始在连接上发送消息。 当iOS应用程序放在后台时,例如通过用户切换到另一个应用程序,该应用程序停止从套接字读取数据,但该套接字仍在iOS中打开。服务器继续发送,直到缓冲区窗口已满,然后挂起send()调用。 有没有办法在调用之前检测到send()调用是否会挂起?或者是一种退出通话的方式,当它挂起时,例如设置超时?
答案 0 :(得分:1)
您可以将发送套接字置于非阻塞模式。
使用fcntl()
F_SETFL
套接字上的O_NONBLOCK
标记。
您正确编写的代码应该已经检查send()
的返回值,因为即使使用阻塞套接字send()
也可能表示写入的字节数少于请求的数量。
在非阻止模式下,send()
会立即返回,返回值为-1,errno
等于EAGAIN
或EWOULDBLOCK
。然后,使用poll()
或select()
检查何时可以将套接字写入下一个。
答案 1 :(得分:0)
将套接字置于非阻塞模式并检测EAGAIN/EWOULDBLOCK
。
答案 2 :(得分:0)
您可以使用简单的select
或poll
,使用零超时,将单个套接字用作写文件描述符/句柄。