套接字编程中的选择函数

Posted

技术标签:

【中文标题】套接字编程中的选择函数【英文标题】:Select function in socket programming 【发布时间】:2011-05-09 10:44:45 【问题描述】:

谁能告诉我select函数在c中socket编程中的使用和应用?

【问题讨论】:

我认为你应该编辑你的问题更具体一点。另外,如果你在问题的末尾加上那么多问号,人们往往不会认真对待这个问题。 【参考方案1】:

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

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

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

【讨论】:

对。 select() 是一个事件多路复用器。 我喜欢你的解释,Ziffusion。我刚开始使用 select 并在网上阅读了相当多的文档,但没有什么比这更接近了。 最好的解释非常感谢。 我前段时间点击了这个,但一直在寻找使用select()poll()(和家庭)之间的区别。我突然想到,如果你有时间和兴趣,用一个简短的段落列出这两种方法之间的区别,它会很适合这里,让你的答案(已经做得很好。)更加有趣和有用。特别是,如果您能描述任何使select()poll() 更适合特定应用程序的功能,那将会很有趣。 (目前我读过的大部分帖子都支持poll() 所以,为了清楚起见,fd 代表“文件描述符”?【参考方案2】:

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

正在读取:当此类别中的任何文件描述符可供读取时,select 会将它们返回给您。

正在写入:当此类别中的任何文件描述符准备好写入时,select 会将它们返回给您。

异常:当此类别中的任何文件描述符出现异常情况时——即它们关闭不干净、连接中断或出现其他错误——@987654323 @ 会将它们返回给您。

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

为了让您获得更具体的答案,您可能必须提及您正在使用哪种语言进行编程。我已尝试在概念级别上给出尽可能笼统的答案。

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

我喜欢gnu.org:的描述

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

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

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

【讨论】:

【参考方案5】:

根据 Linux 手册页和 MSDN for Windows 的文档,

select() 和 pselect() 允许程序监控多个文件 描述符,等到一个或多个文件描述符变为 为某种 I/O 操作“准备好”(例如,可以输入)。一份文件 如果可以执行描述符,则认为已准备好 相应的 I/O 操作(例如,read(2))而不阻塞。

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

举个例子:想象一下在火车上旅行时在智能手机上下载一个大的 Facebook 页面。您的连接断断续续且缓慢,网络服务器应该能够在等待您的通信完成时处理其他客户端。

select(2) - Linux man page select Function - Winsock 函数

【讨论】:

以上是关于套接字编程中的选择函数的主要内容,如果未能解决你的问题,请参考以下文章

客户端中的套接字编程

Unix网络编程chapter3 套接字编程简介

Unix网络编程chapter3套接字编程简介

C 中的 Windows 套接字编程

基本套接口编程中的函数(自用)

UNIX网络编程笔记—基本TCP套接字编程