在套接字编程中选择function

任何人都可以告诉我c中套接字编程中select函数的使用和应用吗?

当您必须处理多个事件源时, select()函数允许您实现事件驱动的设计模式。

假设您要编写一个程序来响应来自多个事件源的事件,例如网络(通过套接字),用户输入(通过stdin),其他程序(通过管道),或者可以用fd表示的任何其他事件源。 您可以启动单独的线程来处理每个事件源,但您必须管理线程并处理并发问题。 另一种选择是使用一种机制,你可以将所有fd聚合成一个单独的实体fdset ,然后调用一个函数来等待fdset 。 只要在任何fd上发生事件,该函数就会返回。 您可以检查事件发生在哪个fd上,读取该fd ,处理事件并对其进行响应。 完成后,你会回去坐在那个等待函数中 – 直到某个fd上的另一个事件到来。

select facility就是这样一种机制, select()函数就是wait函数。 您可以在任意数量的书籍和在线资源中找到有关如何使用它的详细信息。

select函数允许您检查几个不同的套接字或管道(或者如果您不在窗口中,则根本不检查任何文件描述符),并根据先准备好的任何内容执行某些操作。 更具体地说,select函数的参数分为三组:

阅读:当此类别中的任何文件描述符准备好阅读时,选择将返回给您。

写入:当此类别中的任何文件描述符准备好写入时,选择将返回给您。

例外:当此类别中的任何文件描述符具有exception情况时 – 即,它们不正常地关闭,连接断开,或者它们有其他错误 – 选择将返回给您。

select的强大之处在于单个文件/套接字/管道function经常被阻塞。 Select允许您监视多个不同文件描述符的活动,而无需将程序的线程专用于每个函数调用。

为了让你得到一个更具体的答案,你可能不得不提到你正在编程的语言。我试图在概念层面尽可能地给出答案。

select()是轮询套接字的低技术方式,用于读取新数据或打开TCP窗口。 除非有一些令人信服的理由不这样做,否则你可能最好使用poll()或epoll_wait()(如果你的平台有),以获得更好的性能。

更多细节会很好,但我认为你指的是Java NIO的Selector.select()方法。

对您的问题的简单回答是select()(在此上下文中)将等待一个通道(即,由此Selector对象管理的网络连接之一)具有可读取的数据。

当您同时打开许多连接时,许多/大多数将在任何给定时刻处于hibernate状态。 此方法/类允许您管理多个连接,而不必为该连接上的每个连接阻塞单独使用。 您可以使用一个线程阻止多个连接,并且只需接收当前“准备好”的任何连接。

这是一个很棒的小教程,应该让事情变得清晰:

http://rox-xmlrpc.sourceforge.net/niotut/

根据Linux联机帮助页和MSDN for Windows的文档,

select()和pselect()允许程序监视多个文件描述符,等待一个或多个文件描述符为某类I / O操作变为“就绪”(例如,输入可能)。 如果可以在不阻塞的情况下执行相应的I / O操作(例如,读取(2)),则认为文件描述符就绪。

简单说明:应用程序通常需要一次执行多个操作。 例如,您可以在Web浏览器中访问多个站点,Web服务器可能希望同时为多个客户端提供服务。 需要一种机制来监视每个套接字,以便应用程序不忙于等待一个通信完成。

例如:想象一下在火车上下载智能手机上的大型Facebook页面。 您的连接是间歇性和缓慢的,Web服务器应该能够在等待您的通信完成时处理其他客户端。

  • select(2) – Linux手册页
  • 选择function – Winsockfunction

我喜欢gnu.org上的描述:

有时程序需要在输入到达时接受多个输入通道上的输入。 例如,某些工作站可能具有通过普通异步串行接口连接的设备,如数字化平板电脑,function按钮盒或拨号盒; 良好的用户界面风格需要立即响应任何设备上的输入。 […]

您通常不能为此目的使用read ,因为这会阻止程序,直到输入在一个特定的文件描述符上可用; 其他频道上的输入不会唤醒它。 您可以设置非阻塞模式并依次轮询每个文件描述符,但效率非常低。

更好的解决方案是使用select函数。 这将阻止程序直到输入或输出在指定的文件描述符集上就绪,或者直到计时器到期,以先到者为准。