単一の選択呼び出しで最初の非同期サーバーを作成するときに、この問題に遭遇しました。
if( (retv = select((hsock<highestsocket?highestsocket:hsock)+1, &rFdx, &wFdx, &eFdx, 0) ) > 0)
{
printf("select() ended...\n");
if(FD_ISSET(hsock, &rFdx))
{
// .... handle new connection
}
for(unsigned int i=0; i < ClientList.size(); i++)
{
ServerClient* client = ClientList[i];
if(FD_ISSET(client->socket, &rFdx))
{
// handle client read
}
if(FD_ISSET(client->socket, &wFdx))
{
// handle client write
}
}
}
他のスレッドからFD_SETを呼び出すときに、待機を停止してからクライアント書き込みを処理することを選択することを期待しています。
同じスレッドからクライアントソケットでFD_SETを呼び出すと、すべてが期待どおりに機能します。ただし、他のスレッドから呼び出しても何も起こりません。selectは、クライアントからデータを受信するまで待機し続けます。