Как установить дескриптор файла сокета с помощью FD_SET Unix в C / C ++ - PullRequest
0 голосов
/ 10 июля 2020

В настоящее время я работаю над проектом по программированию сокетов. Предположим:

fd_set fd_in;

Теперь я хотел бы установить дескриптор файла для функции выбора:

FD_SET(socket_fd, &fd_in);

Это правильный путь?

Затем я использую функция выбора:

int rc = select(socket_fd + 1, &fd_in, NULL, NULL, NULL);

Проведя небольшое исследование, мне не удалось продолжить.

Я ценю вашу поддержку, С уважением, от Брукса

1 Ответ

0 голосов
/ 10 июля 2020

Соответствующие страницы руководства доступны в сети, например здесь .

Тем не менее, вам может быть непонятно, что перед добавлением каких-либо файловых дескрипторов в fd_set вы сначала нужно очистить его:

FD_ZERO(&fd_in);

Тогда, да, вы используете FD_SET() точно так же, как указано в вопросе:

FD_SET(socket_fd, &fd_in);

Это предполагает, что значение socket_fd является дескриптором открытого файла.

Сделав это, разумно использовать указатель на полученный fd_set как один из аргументов select(), опять же, как вы представляете:

int rc = select(socket_fd + 1, &fd_in, NULL, NULL, NULL);

Обратите внимание, что

  • этот конкретный вызов регистрирует интерес только к указанному файловому дескриптору, который становится доступным для чтения (или для принятия соединения если это прослушивающий сокет), а не для записи или исключительных условий.

  • вы должны проверить возвращаемое значение select() и предпринять соответствующие действия в зависимости от результата. Поскольку вы используете только один fd_set с одним элементом, без тайм-аута, вы должны ожидать, что select вернет либо 1 (когда дескриптор файла готов), либо -1 (при ошибке).

  • вообще говоря, вам нужно настраивать fd_set (s) каждый раз, когда вы вызываете select. За исключением некоторых особых случаев, содержимое наборов после возврата select() часто отличается от того, что было до вызова, и в случае, если select сообщает об ошибке, вы не можете впоследствии вообще полагаться ни на что о них. . Таким образом, когда select() вызывается в al oop, что является обычным явлением, обычно должен быть установочный код fd_set в том же l oop.

...