У меня есть приложение на сервере TCP и клиентское приложение TCP. Сервер работает в нескольких потоках, где в одном потоке блокируется вызов select () с неопределенным временем ожидания:
while(running) {
initFdSets();
nfds = select(max_fd + 1, &listened_fdset, &write_fdset, &exception_fdset, NULL);
...
reads_from_fds_in_listened_fdset();
writes_to_fds_in_write_fdset();
}
между тем, в другом потоке в набор fd для записи в первый раз добавляется действительный дескриптор файла сокета:
FD_SET(connection_socket_fd, write_fdset_ptr);
и вызов select () все еще блокируется.
В течение этого времени клиентское приложение блокирует вызов read (), который хочет прочитать с другой стороны соединения между ними:
read(sockfd, &msgType, sizeof(int32_t));
и ничего не происходит, пока я не прерву приложение сервера в режиме отладки, а затем возобновлю его. После этого select () возвращает, правильный поток байтов отправляется клиентскому приложению и принимается в соответствии с планом. Writefdset повторно инициализируется перед вызовом select () ... но поведение сервера не меняется в новой итерации while ().
Да, все наборы очищаются с помощью FD_ZERO и повторно инициализируются перед вызовом select () (включая дескриптор файла из 2-го фрагмента).
Я буду благодарен за решение этой проблемы, поскольку это последняя проблема, от которой я должен избавиться от своего проекта, но не знаю, как и почему это происходит.