如果套接字设置为非阻塞,
但是在某个时刻,我想在阻塞模式下使用send或recv这个套接字,
我可以暂时将其作为阻止模式发送,然后恢复到非阻止状态。
如果是这样,反过来怎么样?如果套接字处于阻塞模式,请在非阻塞模式下临时使用send或recv吗?谢谢!
答案 0 :(得分:3)
您可以将fcntl()
与O_NONBLOCK
标记一起使用。
用它来设置套接字阻塞模式,发送(或重新)数据并再次使用fcntl
将套接字设置为非阻塞模式。
答案 1 :(得分:2)
我可以暂时将其作为阻止模式发送,然后恢复到非阻止状态。
是的,当然,只是反过来使用FIONBIO。
如果是这样,反过来怎么样?如果套接字处于阻塞模式,请在非阻塞模式下临时使用send或recv吗?
是的,当然。有两种方法:使用FIONBIO或使用MSG_DONTWAIT标志来recv()。
答案 2 :(得分:1)
您可以更改模式,或者您可以使用select()
或epoll()
来检测套接字何时可读/可写,然后执行通常会阻塞的recv/send()
或模拟通过在预期数据仍处于待处理状态时读取/发送循环来阻止行为。
答案 3 :(得分:0)
嗯,正如已经说过的那样,您当然可以随时通过fcntl()
调用更改状态。但是我并不真正理解这个要求,因为当你实现一个非阻塞算法时,你当然可以通过简单的循环使它看起来好像是阻塞的。
而且无论如何你都需要一个协议,所以在我看来,好像你是在依赖某些特定的行为。