如果套接字设置为非阻塞,
但是在某个时刻,我想在阻塞模式下对这个套接字使用 send 或 recv,
我可以暂时将其作为阻塞模式发送,然后恢复为非阻塞。
如果是这样,反过来呢?如果套接字处于阻塞模式,则在非阻塞模式下临时使用 send 或 recv?
谢谢!
如果套接字设置为非阻塞,
但是在某个时刻,我想在阻塞模式下对这个套接字使用 send 或 recv,
我可以暂时将其作为阻塞模式发送,然后恢复为非阻塞。
如果是这样,反过来呢?如果套接字处于阻塞模式,则在非阻塞模式下临时使用 send 或 recv?
谢谢!
您可以fcntl()
与O_NONBLOCK
标志一起使用。
使用它将套接字设置为阻塞模式,发送(或接收)您的数据并fcntl
再次使用将套接字设置为非阻塞模式。
我可以暂时将其作为阻塞模式发送,然后恢复为非阻塞。
是的,当然,只是反过来使用 FIONBIO。
如果是这样,反过来呢?如果套接字处于阻塞模式,则在非阻塞模式下临时使用 send 或 recv?
是的当然。有两种方法可以做到这一点:使用 FIONBIO 或将 MSG_DONTWAIT 标志用于 recv()。
您可以更改模式,或者您可以在执行通常会阻塞的操作之前仅使用select()
或epoll()
检测套接字何时可读/可写,或者通过在预期数据仍处于未决状态时循环读取/发送来模拟阻塞行为。recv/send()
好吧,正如已经说过的,您当然可以随时通过fcntl()
调用更改状态。但是我不太明白这个要求,因为当你实现一个非阻塞算法时,你当然可以通过简单的循环让它看起来好像是阻塞的。无论如何,您将需要一个协议,因此在我看来,这似乎是您依赖于某些特定行为。