Создание однопоточного сервера с winsock: select дает список сокетов, мне нужен индекс
Я создал однопоточный сервер с функциями winsock. В принципе работает нормально, но мне нужно улучшить. Эта реализация сервера предназначена для работы на встроенной системе с ограниченными ресурсами, поэтому ее необходимо оптимизировать:
Мой единственный поток обрабатывает получение данных для всех соединений. Все сокеты не блокируются, и моя функция получения выглядит следующим образом (я извлек соответствующий код):
fd_tmp = fd_read;
iResult = select(0,&fd_tmp,NULL,NULL,0);
for ( u_int i = 0 ; i < fd_tmp.fd_count ; ++i )
{
SOCKET actsock = fd_tmp.fd_array[i];
// need to search for connection entry in table, which is related to receive socket
int iConnRef = -1;
for ( int i = 0 ; i < MAXNUM_CONNECTIONS ; ++i )
{
if ( asConnList[i].fValid && asConnList[i].sock == actsock )
{
iConnRef = i;
break;
}
}
if ( iConnRef != -1 )
{
// proceed with computing received data
iResult = recv( actsock,(char*)&abRxBuffer[nOffs],nBytesRemaining, 0 );
...
На самом деле код работает хорошо. Но каждый раз, получая данные, мне нужно искать в своей таблице соединений соединение, которое связано с сокетом. Этот цикл занимает слишком много времени во встроенной системе!
Как я мог избежать этого? Есть ли дополнительная информация, которую предоставляет select()? если бы он поставил индекс в таблице, который я дал в качестве параметра, это было бы идеально. Или есть возможность принудительно использовать дескрипторы сокетов из предопределенного списка? Если бы дескрипторы сокетов были последовательно пронумерованы, я мог бы использовать их в качестве индекса в таблице.
Есть идеи?
Большое спасибо