この質問が繰り返されると言って、人々はこの質問に苦労するだろうと確信しています。しかし、私は具体的なことを尋ねるつもりでした。選択呼び出しがハンドルを取得できず、ポーリング システム呼び出しがハンドルを認識できるというシナリオに直面しました。
その背後になだめるような理由は見つかりません。シナリオを説明しましょう-同じマシンにないサーバーにscocketクライアントを登録しようとしていました。クライアントが同じマシンにある場合、select システム コールは効率的に機能します。ただし、同じマシンの一部ではない場合、失敗し、ポーリングが機能します。
この背後にある一般的な反響はありますか?(注:私は 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;
}