Создание однопоточного сервера с 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()? если бы он поставил индекс в таблице, который я дал в качестве параметра, это было бы идеально. Или есть возможность принудительно использовать дескрипторы сокетов из предопределенного списка? Если бы дескрипторы сокетов были последовательно пронумерованы, я мог бы использовать их в качестве индекса в таблице.

Есть идеи?

Большое спасибо

0 ответов

Другие вопросы по тегам