0

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

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

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

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

谢谢!

4

4 回答 4

3

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

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

于 2013-06-14T11:53:57.143 回答
2

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

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

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

是的当然。有两种方法可以做到这一点:使用 FIONBIO 或将 MSG_DONTWAIT 标志用于 recv()。

于 2013-06-14T11:54:18.483 回答
1

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

于 2013-06-15T14:55:09.080 回答
0

好吧,正如已经说过的,您当然可以随时通过fcntl()调用更改状态。但是我不太明白这个要求,因为当你实现一个非阻塞算法时,你当然可以通过简单的循环让它看起来好像是阻塞的。无论如何,您将需要一个协议,因此在我看来,这似乎是您依赖于某些特定行为。

于 2013-06-14T12:30:32.350 回答