在C+;中使用异步TCP套接字有更好的方法吗+;而不是投票或选择? 我最近开始编写一些使用套接字的C++代码,我想异步。我读过很多关于如何使用poll和select使套接字异步(使用poll或select等待发送或recv缓冲区)的文章,但在我的服务器端,我有一个struct pollfd数组,每次侦听套接字接受连接时,它都会将其添加到struct pollfd数组中,以便它可以监视该套接字的recv(波林)

在C+;中使用异步TCP套接字有更好的方法吗+;而不是投票或选择? 我最近开始编写一些使用套接字的C++代码,我想异步。我读过很多关于如何使用poll和select使套接字异步(使用poll或select等待发送或recv缓冲区)的文章,但在我的服务器端,我有一个struct pollfd数组,每次侦听套接字接受连接时,它都会将其添加到struct pollfd数组中,以便它可以监视该套接字的recv(波林),c++,sockets,asynchronous,tcp,C++,Sockets,Asynchronous,Tcp,我的问题是,如果我的服务器上有5000个套接字连接到我的侦听套接字,那么struct pollfd数组的大小将是5000,因为它将监视所有连接的套接字,但我知道如何检查套接字的recv是否就绪的唯一方法是通过循环struct pollfd数组中的所有项来查找当连接的套接字数量非常大时,这似乎有点低效。有更好的方法吗 boost::asio库如何处理异步接收、异步发送等?我应该如何处理?见鬼,我会继续写一个答案 我将忽略“异步”与“非阻塞”的术语,因为我认为这与您的问题无关 在处理数千个网络客户端

我的问题是,如果我的服务器上有5000个套接字连接到我的侦听套接字,那么struct pollfd数组的大小将是5000,因为它将监视所有连接的套接字,但我知道如何检查套接字的recv是否就绪的唯一方法是通过循环struct pollfd数组中的所有项来查找当连接的套接字数量非常大时,这似乎有点低效。有更好的方法吗


boost::asio库如何处理异步接收、异步发送等?我应该如何处理?见鬼,我会继续写一个答案

我将忽略“异步”与“非阻塞”的术语,因为我认为这与您的问题无关

在处理数千个网络客户端时,您担心的是性能问题,您的担心是对的。您重新发现了性能问题。早在Web还年轻的时候,人们就看到需要少量快速服务器来处理大量(相对而言)客户端速度慢。现有的选择/轮询类型接口需要在内核和用户空间中对所有套接字进行线性扫描,以确定哪些套接字已准备就绪。如果许多套接字经常处于空闲状态,服务器可能会花费比实际工作更多的时间来确定要做什么

快进到今天,我们基本上有两种方法来处理这个问题:

1) 每个套接字使用一个线程,只需发出阻塞读写。在我看来,这通常是最简单的编码,现代操作系统非常擅长让空闲线程安静地休眠,而不会造成任何显著的性能开销。根据我的经验,这种方法适用于数百个客户;我个人不能说它将如何为数千人服务


2) 使用为解决C10K问题而引入的平台特定接口之一。这意味着epoll(Linux)、kqueue(BSD/Mac)或完成端口(Windows)。(如果您认为
epoll
poll
相同,请再次查看。)所有这些都只会通知您的应用程序实际准备好的套接字,避免在空闲连接之间进行浪费性的线性扫描。有几个库使这些特定于平台的接口更易于使用,包括libevent、libev和Boost.Asio。您会发现,只要这些接口可用,它们最终都会在Linux上调用epoll,在BSD上调用kqueue,等等。

没有boost-in,请在选择标记时小心。您混淆了“非阻塞”和“异步”。它们是不同的模式
select()
和friends用于非阻塞I/O。听起来好像您需要异步I/O,在这种情况下,您应该使用
boost
,或者切换到另一种内置异步的语言,如Java。但对于仅5000个客户端,您不应忽略使用线程阻塞I/O。@EJP。。。或者考虑使用,如果你不能仅仅使用Boost,那么你的选项是(a)为每个客户端创建一个线程(如@ EJP所提到的)或者(b)使用一个特定于平台的接口来高效地处理这种I/O。根据您的平台,该接口可能被命名为“epoll”或“kqueue”或“完成端口”。轮询和epoll之间有很大区别吗?此外,每当我查看有关异步套接字的文章时,他们总是提到select或poll的用法,而从来没有看到出现任何线程。我们基本上有三种方法:您提到的两种方法和异步I/O。@EJP:在较低的级别上,您的“异步I/O”可能是建立在这两种方法之一的基础上的。(例如,Boost.Asio当然是。)尽管我可能不理解你对这个词的用法。顺便说一句,Wikipedia将“异步I/O”定义为“非阻塞I/O”(non-blocking I/O)的同义词,然后继续给出与此问题或我的答案无关的描述。