У меня есть несколько вопросов о функции выбора, я писал этот код: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;
}
}
}
}
}
я могу дать первый ARG, чтобы выбрать функцию, и я могу не делать этого, но почему? Почему a должен дать первый аргумент для выбора? m_fdmax - это самое большое количество сокетов, но этот код работает без этого аргумента.
Следующий вопрос: зачем нужен тайм-аут? Когда я не даю этому аргументу, вы выбираете все сокеты как сокеты, которые могут быть прочитаны, но выберите это, когда сокет не имеет данных для чтения. Когда я даю этот аргумент, у меня нет этой проблемы. Но почему ?
Если 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];
}
Реализация Windows 'select()' игнорирует первый параметр. Это указано в документации ['select()') (http://msdn.microsoft.com/en-us/library/windows/desktop/ms740141.aspx). –