Выбор сокетов, уменьшающий количество сокетов в наборе дескрипторов файлов - PullRequest
1 голос
/ 31 декабря 2010

У меня есть фрагмент кода, который принимает 2 соединения, создает набор файловых дескрипторов с соответствующими им сокетами и передает его на выбор. Но когда select возвращает, число дескрипторов файлов в наборе дескрипторов файлов было уменьшено до 1, и select может просто обнаружить полученные данные для первого сокета в массиве fd_array.

Любые идеи, где я должен смотреть?

Заранее спасибо,

Andre

fd_set mSockets;

/* At this point

mSockets.fd_count = 2
mSockets.fd_array[0] = 3765
mSockets.fd_array[1] = 2436

*/

select(0, & mSockets, 0, 0, 0);

/* At this point

mSockets.fd_count = 1
mSockets.fd_array[0] = 3765
mSockets.fd_array[1] = 2436

*/

1 Ответ

3 голосов
/ 31 декабря 2010

То есть, по заданию параметры readfds, writefds и excefds функций select являются параметрами in / out.

Вы должны инициализировать fd_set перед каждым вызовом, чтобы выбрать:

SOCKET s1;
SOCKET s2;

// open sockets s1 and s2

// prepare select call    
FD_ZERO(&mSockets);
FD_SET(s1, &mSockets);
FD_SET(s2, &mSockets);

select(0, &mSockets, 0, 0, 0);

// evaluate select results
if (FD_ISSET(s1, &mSockets))
{
    // process s1 traffic
}


if (FD_ISSET(s2, &mSockets))
{
    // process s2 traffic
}

Кроме того, Cou может проверить возвращаемое значение выбора.Это указывает на недействительность, если вы вообще можете работать с сокетами.Т.е. нулевой возврат указывает, что все amcros FD_ISSET вернут 0.

РЕДАКТИРОВАТЬ:

Так как readfds, writefds и exceptionfds также out параметрыиз выбранных функций, они изменены.Член fd_count указывает, сколько членов fd_array являются действительными.Вы не должны оценивать fd_array[1], если fd_count меньше 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...