Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
C++ 如何从select()函数中获取套接字列表?_C++_Sockets_Networking_Select_Io - Fatal编程技术网

C++ 如何从select()函数中获取套接字列表?

C++ 如何从select()函数中获取套接字列表?,c++,sockets,networking,select,io,C++,Sockets,Networking,Select,Io,我正在处理一个网络项目,我知道select()函数(使用FD_XXX)返回准备就绪并包含在FD_集合结构中的套接字句柄总数,但我们知道这些套接字(作为套接字或INT)吗?只有通过FOR-LOOP-CHECK FD_ISSET才能获得套接字列表,对吗?否则怎么办?不管别人怎么说select()的返回值,我在处理许多套接字时都是这样使用它的,它不能保证您不必处理所有列表,以防只有一个套接字恰好是最后一个,但如果它是第一个,则会保存一些代码 int i; int biggest=0; fd_set s

我正在处理一个网络项目,我知道select()函数(使用FD_XXX)返回准备就绪并包含在FD_集合结构中的套接字句柄总数,但我们知道这些套接字(作为套接字或INT)吗?只有通过FOR-LOOP-CHECK FD_ISSET才能获得套接字列表,对吗?否则怎么办?

不管别人怎么说select()的返回值,我在处理许多套接字时都是这样使用它的,它不能保证您不必处理所有列表,以防只有一个套接字恰好是最后一个,但如果它是第一个,则会保存一些代码

int i;
int biggest=0;
fd_set sfds;
struct timeval timeout={0, 0};

FD_ZERO(&sfds);
for (i=0; i < NumberOfsockets; i++)
{
    FD_SET(SocktList[i], &sfds);
    if (SocktList[i] > biggest) biggest=SocktList[i];
}

timeout.tv_sec=30;
timeout.tv_usec=0;

// biggest is only necessary when dealing with Berkeley sockets,
// Visual Studio C++ (and others) ignore this parameter.
if ((nReady=select((biggest+1), &sfds, NULL, NULL, TimeOut)) > 0)
{
   for (i=0; i < NumerbsOfSocket && nReady > 0; i++)
   {
      if (FD_ISSET(SocketList[i], &sfds)) {
         // SocketList[i] got data to be read
         ... your code to process the socket when it's readable...
         nReady--;
      }
   }
}
inti;
int=0;
fd_集sfds;
struct timeval timeout={0,0};
FD_零和SFD;
对于(i=0;i最大)最大=SocktList[i];
}
超时。电视秒=30;
超时。tv_usec=0;
//只有在处理Berkeley sockets时才需要最大,
//VisualStudioC++(以及其他)忽略此参数。
如果((nReady=select((最大值+1),&sfds,NULL,NULL,超时))>0)
{
对于(i=0;i0;i++)
{
if(FD_ISSET(套接字列表[i]、&sfds)){
//SocketList[i]获取了要读取的数据
…当套接字可读时处理它的代码。。。
nReady--;
}
}
}

是的,你说得对。我不知道为什么select甚至会返回高于1的任何其他值,因为它无论如何都没有帮助。@Devlus OK谢谢!:)大多数系统都有等待I/O事件的替代方法,如果有大量的文件描述符,这种方法更适合。例如,Linux有syscalls和
epoll\u wait(2)
返回准备好的文件描述符列表。@nosid在windows中pool()的同义词是什么?完美的例子!谢谢你!你觉得高性能的插座怎么样?select()方法适合它吗?还有什么?你能用什么来衡量“高绩效”吗?速度?便携性?易于维护?如果你有一个千兆字节的网卡和一台四处理器的机器,我想你从网络上读取数据时不会遇到任何问题,只要选择并通过列表选择相应的套接字。如果有很多打开的插槽,瓶颈可能在网卡本身。此外,您可以考虑使用各种线程来处理套接字,每个线程都有自己的套接字列表。另外,我要求的是软件,而不是硬件。(也就是说,这不是一个好主意)