我很确定人们会很难回答这个问题,说这是一个重复的问题。但我打算问一些具体的事情。我遇到了这样一个场景,其中一个 select 调用无法获得句柄,而 poll 系统调用可以识别句柄。
我没有找到任何令人欣慰的理由。让我解释一下这个场景——我试图让一个 scocket 客户端注册到不在同一台机器上的服务器。当客户端在同一台机器上时,选择系统调用可以有效地工作。但是当它不是同一台机器的一部分时,它会失败并且轮询工作。
这背后有什么普遍的共鸣吗?(注意:我正在使用 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;
}