【问题标题】:Understanding select() function for implement了解 select() 函数以实现
【发布时间】:2013-06-24 00:31:02
【问题描述】:

我正在开发一个网络项目(套接字)。我读过一些像link>>link>> 这样的文章,但我不能很好地理解它们。我想在服务器端处理操作,我应该理解它们。现在我认为 readfds 是处理传入数据操作(对吗?我不知道)和 writefds 是处理传出数据(使用 send() 方法)操作(对吗?我不知道)。最后一个; exceptfds 用于处理套接字异常,例如断开/关闭操作(对吗?我不知道)。这些只是我的问题,我对它们一无所知(没有文章描述),我想在这里问他们了解。有人可以帮我解决这个问题吗?我将在服务器端(高性能)实现 I/O 系统,我需要非常了解它们!谢谢...

【问题讨论】:

  • 你的 readfdswritefds 是对的。链接到an explanation of exceptfds。此外,select() 可能不是高性能系统的最佳选择。请考虑 epoll(在 Linux 上)或 kqueue(在 bsd 上)。即使poll() 也可能比select() 做得更好。
  • @jxh 谢谢,我正在查看内部...

标签: c++ sockets networking select io


【解决方案1】:

在最一般的意义上,select() 是一种让您的应用程序等到有趣的事情发生的方式。这个有趣的事件可以是:

  • 数据在您在readfds 中列出的一个套接字上可用,因此从该套接字尝试read() 不会阻塞。

  • 写入空间在您在writefds 中列出的其中一个套接字上可用,因此尝试write() 到该套接字不会阻塞。

  • 在您在exceptfds 中列出的一个套接字上发生了一些不寻常的事情(例如接收到带外数据)。

  • 您在timeout 中指定的时间已经过去,但没有发生其他任何事情。

【讨论】:

  • 您如何看待高性能套接字? select() 方法是否适合它?还有什么?
  • 有一些技术(例如,AIO、epoll()kqueue())最终在非常高的并发下性能会稍微好一些,但您不太可能需要它们。不过,如果您真的感兴趣,您可能想查看libev,它抽象了一些特定于平台的讨厌。
猜你喜欢
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
  • 2013-10-11
相关资源
最近更新 更多