select 関数についていくつか質問があります。次のコードを書きました。
void TCPSerwer::sel()
{
struct timeval tv = {1, 0};
fd_set temp_list = m_RecvList;
//if(select(m_fdmax + 1, &temp_list, NULL, NULL, &tv) == SOCKET_ERROR)
if(select(0, &temp_list, NULL, NULL, &tv) == SOCKET_ERROR)
{
perror( "select" );
exit( 1 );
}
for(int i = 0; i <= m_fdmax; i++ )
{
if(FD_ISSET(i, &temp_list))
{
// New connection
if(i == m_ListenSocket)
{
acceptClient();
}
// Data from client
else
{
PacketHeader header;
int nbytes = recv(i, (char*)(&header), sizeof(PacketHeader),
// Error
if(nbytes < 0)
{
disconnectClient(i);
}
// success
else
{
std::cout << "type: " << header.type << " len: " << header.length << std::endl;
}
}
}
}
}
関数を選択するために最初の引数を与えることができますが、それはできませんが、なぜですか? select に最初の引数を与える必要があるのはなぜですか? m_fdmax はソケットの最大数ですが、このコードはこの引数なしで機能します。
次の質問は、なぜタイムアウトが必要なのかを選択することです。この引数を指定しない場合、select はすべてのソケットを読み取り可能なソケットとしてマークしますが、ソケットに読み取るデータがない場合はこれを選択します。この引数を与えると、この問題はありません。しかし、なぜ ?
m_fdmax がソケットの最大数の場合、接続を閉じるときに次に高いソケット数を見つける必要がありますよね? そして、私はこれを行う必要があります:
int size = m_ClientVector.size();
for(int i = 0; i < size; i++)
{
if(m_ClientVector[i] > m_fdmax)
m_fdmax = m_ClientVector[i];
}