Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 异步TCP套接字-澄清?_.net_Sockets_Asynchronous_Tcpclient - Fatal编程技术网

.net 异步TCP套接字-澄清?

.net 异步TCP套接字-澄清?,.net,sockets,asynchronous,tcpclient,.net,Sockets,Asynchronous,Tcpclient,异步不需要并行才能存在。 例如,当IO操作(web、硬盘操作…)时 可以释放当前线程,然后在IO操作完成后 完成,通过完成端口,线程返回以处理 结果 这一点并不是阻碍 我不太熟悉插座,但我读过很多书 但当我读到异步套接字时,我看到的只是一些示例,其中接受新连接的主线程正在打开一个新的后台线程,等待来自客户端的消息 从MSDN: 异步套接字使用系统线程池中的线程来 处理传入连接。一个线程负责接受 连接时,另一个线程用于处理每个传入的 连接,另一个线程负责从 连接。这些线程可能是同一个线程,具体取

异步不需要并行才能存在。 例如,当IO操作(web、硬盘操作…)时 可以释放当前线程,然后在IO操作完成后 完成,通过完成端口,线程返回以处理 结果

这一点并不是阻碍

我不太熟悉插座,但我读过很多书

但当我读到异步套接字时,我看到的只是一些示例,其中接受新连接的主线程正在打开一个新的后台线程,等待来自客户端的消息

从MSDN:

异步套接字使用系统线程池中的线程来 处理传入连接。一个线程负责接受 连接时,另一个线程用于处理每个传入的 连接,另一个线程负责从 连接。这些线程可能是同一个线程,具体取决于哪个线程 线程由线程池分配。在下面的示例中 System.Threading.ManualResetEvent类暂停主线程的执行 线程,并在执行可以继续时发出信号

  • 建造
  • 装订

  • 侦听/异步套接字操作利用称为非阻塞IO的东西。以下是非阻塞IO行为:

  • 如果线程调用带有“open\u non\u blocking”标志的read,并且没有可用数据,则调用返回“try\u”
  • 如果线程使用“open\u non\u blocking”标志调用write,并且输出缓冲区已满,则调用返回“try\u”
  • 此外,select()系统调用将非阻塞IO带到下一个级别。它构建在非阻塞IO之上,并将检查流就绪性的任务卸载给驱动程序。驱动程序被要求检查一组流是否准备就绪,并为每一组流向调用线程返回一个位掩码。位掩码向线程指示哪些流已就绪。这允许调用线程利用驱动程序返回的就绪信息,使用单个线程多路复用多个活动流。应用程序服务器用于处理大量客户机的select调用,并可扩展以获得高容量。 Select操作的工作原理是阻塞应用程序线程,直到在一组文件描述符(套接字表示为文件描述符)上发生某些事情。那是什么东西?直到其中一个文件描述符准备好读取或写入数据。通常,基于select()的应用程序服务器将执行以下操作:

  • 用要读入的文件描述符填充fd_集数据结构
  • 使用要写入的文件描述符填充fd_集数据结构
  • 调用select()
  • 网络驱动程序会阻止呼叫,直到出现问题
  • 当其中一个文件描述符的状态发生更改时,网络驱动程序将唤醒线程并返回调用
  • 一旦select()返回,应用程序线程就可以通过检查select()调用返回的每个文件描述符的位掩码来找到哪些文件描述符是可用的。线程可以通过执行读、写或挂断来为准备就绪的FD提供服务
  • 应用程序线程可以重复相同的过程

  • 在您的例子中,异步套接字框架利用select()调用,这允许它对文件描述符上的事件做出反应;虽然您的应用程序可以继续执行自己的工作,直到异步套接字框架完成读/写操作。

    您还可以查看。它展示了如何将TCP侦听器和所有客户端处理程序放在一个线程中。两者都实现为异步任务,因此允许异步运行它们。有关完整的工作示例,请参见SingleSand.Samples.TcpServer.Server和SingleSand.Samples.TcpServer.Client。

    侦听时不需要阻塞线程。您(或您的框架)所做的只是将服务器套接字配置为非阻塞,然后使用select()为服务器套接字注册对ACCEPT的兴趣。select()正在阻塞,但是,它会注意在任何文件描述符(包括注册为accept的服务器套接字)的状态发生更改时发出通知。这在通常被称为框架的“事件循环”中得到了注意。这个答案将非阻塞I/O与异步I/O混为一谈。它们不是一回事。在TCP中,“侦听”只是指将端口置于侦听状态。你的问题似乎是关于异步阅读的。
    //  The meaning of "asynchronous" is that the socket operation, whether
    //  it be a read, write, connect, or accept, happens in a background
    //  thread and thus leaves your application free to do something
    //  else while the socket operation is running.