C# 插座术语-什么是“插座”;“封锁”;什么意思?

C# 插座术语-什么是“插座”;“封锁”;什么意思?,c#,sockets,tcp,C#,Sockets,Tcp,用C#谈论套接字编程时,术语阻塞是什么意思 我需要构建一个服务器组件(可能是Windows服务),它将接收数据、进行一些处理并将数据返回给调用方。呼叫方可以等待回复,但我需要确保多个客户端可以同时呼叫 如果客户端1连接,并且我花了10秒来处理他们的请求,那么2秒后客户端2调用的套接字是否会被阻止?或者服务会在另一个线程上开始处理第二个请求吗 总之,我的客户端可以等待响应,但我必须能够同时处理多个请求。这意味着您不能将套接字用于当前执行线程上的任何其他内容 它与服务器端无关。 这意味着线程在等待套

用C#谈论套接字编程时,术语阻塞是什么意思

我需要构建一个服务器组件(可能是Windows服务),它将接收数据、进行一些处理并将数据返回给调用方。呼叫方可以等待回复,但我需要确保多个客户端可以同时呼叫

如果客户端1连接,并且我花了10秒来处理他们的请求,那么2秒后客户端2调用的套接字是否会被阻止?或者服务会在另一个线程上开始处理第二个请求吗


总之,我的客户端可以等待响应,但我必须能够同时处理多个请求。

这意味着您不能将套接字用于当前执行线程上的任何其他内容

它与服务器端无关。 这意味着线程在等待套接字响应时暂停

如果不希望暂停,请使用异步方法


阅读更多信息:

每个线程应该使用一个套接字。阻塞套接字(同步)在返回之前等待响应。非阻塞(异步)可以查看是否接收到任何数据,如果没有数据则返回。

阻塞意味着在基础套接字操作完成之前,您所做的调用(发送/接收)不会返回(“阻塞”)

对于读取,这意味着直到接收到一些数据或关闭套接字。 对于write,它意味着缓冲区中的所有数据都已发送出去

要处理多个客户端,请为每个客户端启动一个新线程/将工作交给线程池中的一个线程


无法共享连接的TCP套接字,因此每个客户端必须有一个套接字。

阻塞调用将保留当前正在执行的线程,直到调用完成

例如,如果希望从网络流中读取10个字节,请按如下所示调用read方法

byte[] buf = new byte[10];
int bytesRead = stream.Read(buf, 0, buf.Length);
当前正在执行的线程将阻塞读取调用,直到读取了10个字节(或者读取超时已过期)

存在异步读写变体,以防止阻塞当前线程。它们遵循.NET中的标准APM模式。异步变体可以防止您必须向每个客户机处理一个线程(该线程将被阻塞),从而提高您的可伸缩性


阻塞操作通常是那些发送或接收数据以及建立连接的操作(即侦听新客户机或连接到其他侦听器)。

要回答您的问题,阻塞基本上意味着控件停留在函数或代码块中(例如c++中的readfile())直到它返回并且不移动到此代码块后面的代码。 这可以在单线程或多线程上下文中进行。尽管在单线程代码中使用阻塞调用基本上会导致灾难

解决方案:

要在C#中解决这个问题,只需在套接字上下文中使用异步方法,例如BeginInvoke()和EndInvoke(),它们将不会阻止调用。这就是所谓的异步编程方法。 您可以在委托或控件上调用BeginInvoke()和EndInvoke(),具体取决于您采用的异步方法。

您可以使用该函数

检查多个套接字的可读性或可写性。优点是这很简单。它可以从单个线程完成,您可以指定要等待多长时间,可以是永久(-1微秒),也可以是特定的持续时间。而且您不必使套接字异步(即:保持它们阻塞)

它也适用于监听套接字。它将报告可写性。当存在要接受的连接时。通过实验,我可以说它还报告了优雅断开连接的可读性


它可能没有异步套接字那么快。它也不适合检测错误。我对第三个参数没有太多用处,因为它不会检测到不正常的断开连接。

如果你真的需要使用原始套接字,那么网络上有几十个多线程服务器的例子,只要有一个google。如果您不需要使用原始套接字,那么请查看WCF。-1:第一句话完全错误(一般建议不要这样做,并使用异步操作以避免将线程绑定到套接字)。答案的其余部分基本正确,但不明确(“response”在这里有两种含义:API返回和来自套接字另一端的数据)。我不建议初学者从异步操作开始,因为OP显然是这样的。对于新手来说,
每个线程应该使用一个套接字
是一个非常好的建议。但是,异步操作不会“偷看”。它们只是“睡眠”,直到操作系统告诉套接字上有东西到达。
Select(IList checkRead, IList checkWrite, IList checkError, int microSeconds)