当套接字设置为非阻塞时,有什么方法可以在阻塞模式下临时使用send或recv

时间:2013-06-14 11:42:09

标签: c sockets network-programming

如果套接字设置为非阻塞,

但是在某个时刻,我想在阻塞模式下使用send或recv这个套接字,

我可以暂时将其作为阻止模式发送,然后恢复到非阻止状态。

如果是这样,反过来怎么样?如果套接字处于阻塞模式,请在非阻塞模式下临时使用send或recv吗?

谢谢!

4 个答案:

答案 0 :(得分:3)

您可以将fcntl()O_NONBLOCK标记一起使用。

用它来设置套接字阻塞模式,发送(或重新)数据并再次使用fcntl将套接字设置为非阻塞模式。

答案 1 :(得分:2)

  

我可以暂时将其作为阻止模式发送,然后恢复到非阻止状态。

是的,当然,只是反过来使用FIONBIO。

  如果是这样,反过来怎么样?如果套接字处于阻塞模式,请在非阻塞模式下临时使用send或recv吗?

是的,当然。有两种方法:使用FIONBIO或使用MSG_DONTWAIT标志来recv()。

答案 2 :(得分:1)

您可以更改模式,或者您可以使用select()epoll()来检测套接字何时可读/可写,然后执行通常会阻塞的recv/send()或模拟通过在预期数据仍处于待处理状态时读取/发送循环来阻止行为。

答案 3 :(得分:0)

嗯,正如已经说过的那样,您当然可以随时通过fcntl()调用更改状态。但是我并不真正理解这个要求,因为当你实现一个非阻塞算法时,你当然可以通过简单的循环使它看起来好像是阻塞的。 而且无论如何你都需要一个协议,所以在我看来,好像你是在依赖某些特定的行为。