我很确定人们会在这个问题上很难说这是一个重复的问题。但是我打算问一些具体的事情。我面临着一个场景,在这种情况下,选择的呼叫未能获取汉德斯,因为民意测验系统可以识别手柄。
我找不到背后任何舒缓的理由。让我解释一下场景 - 我试图让SCOCTENT客户端注册到不在同一台计算机中的服务器。当客户端在同一台计算机中时,选择系统可以有效地工作。但是,当它不是同一台计算机的一部分时,它会失败并有效。
背后有任何一般共鸣吗?(注意:我正在使用ACE包装库)添加代码片段
int noOfHandles = 4;
int handles[4];
int result = thedserver->get_handles(handles,noOfHandles);
if ((result < 0 ) || (noOfHandles <= 0))
{
return -1;
}
ACE_Handle_Set dsdHandleSet;
for( int i = 0 ; i < noOfHandles ; i++)
{
cout << "handles: " << handles[i] << endl;
dsdHandleSet.set_bit(handles[i]);
}
cout << "noOfHandles: " << noOfHandles << endl;
ACE_Time_Value tv1(60, 0);
while(1)
{
int res = ACE::select(dsdHandleSet.max_set() + 1, &dsdHandleSet, 0, 0,&tv1);
cout << "res: " << res << endl;
}
我想我不确定您的代码要做什么。我不知道为什么您要while(1)
选择功能,但是这里有许多问题。确保您阅读了Select()
首先,您设置了一个超时。如果您想永远等到手柄准备就绪,请通过NULL
以获取超时值。
第二,每次运行后,select()
会修改超时,因此您要使用它,必须重写它。您可以使用pselect()
来避免这种情况。
最后,您应该使用FD_ZERO()
和FD_SET()
清除并设置文件描述符。
在ACE库中可能为您抽象了其中的一些,我对此不熟悉,但是通常这些是我看到的部分。
我怀疑您在代码中遇到错误,或者文件描述符在fd_setsize之外(这是代码中的错误)。在我查看如何实现选择/民意调查的系统上,通过将内在的参数转换为等效的民意调查(或较旧的系统中的VICE)来实现选择。换句话说 -
我不确定ACE库,但是select
系统调用修改其参数。您需要在循环中每次致电select
之前重新创建集合。