socket阻塞的目的

本文关键字:socket | 更新日期: 2023-09-27 18:12:56

我已经在c#中使用Begin/EndAccept/Send/Receive方法一段时间了,但直到最近才发现System.Net.Sockets的阻塞bool选项

这是更好的选择吗?如果不是,那么指定Socket是否应该阻塞的目的是什么?它仅仅是一个有用的指标,是否开发人员已经选择实现阻塞/非阻塞方法?

socket阻塞的目的

试图在阻塞套接字上调用Receive调用意味着该调用在数据到达之前不会返回。当使用阻塞套接字时,您的线程实际上处于停滞状态,直到数据可用为止。因此,如果你试图在Winforms应用程序的UI线程上执行套接字I/O,你的UI将无响应并冻结,直到数据到达。

非阻塞套接字允许代码做其他事情。如果在非阻塞套接字上调用Receive,如果没有可用的数据,它将立即返回。非阻塞套接字通常与周期性轮询机制,"选择"风格的等待调用或其他通知机制结合使用,以指示数据可用。net还提供套接字上的BeginReceive方法作为另一种选择。

在"阻塞"answers"非阻塞"之间的选择是一个设计选择。选择要么影响线程模型(要么线程模型影响决策)。两者都有设计意义。

早期版本的。net没有提供BeginReceive IIRC。而async-await直到后来的。net版本中才可用。大多数平台上的传统套接字模型只有"send"answers"recv",并可选择设置非阻塞模式。