Итак, я читал об асинхронных сокетах
Судя по тому, что следует, я не думаю, что у вас есть. Вы, кажется, читали о неблокирующих сокетах. Не то же самое.
1: я могу использовать блокирующий сокет с select () без последствий, правильно?
Нет. Рассмотрим случай, когда прослушивающий сокет становится читаемым, указывая на предстоящий accept()
, но в то же время клиент закрывает соединение. Если вы затем позвоните accept()
, вы будете блокировать до следующего входящего соединения next , не позволяя вам обслуживать другие сокеты.
2: Когда я использую FD_SET (), я добавляю текущий fd_set *, не меняя его, правильно?
Нет. Вы настраиваете немного. Если он уже установлен, ничего не меняется.
3: при использовании FD_CLR () я могу просто передать идентификатор сокета сокета, который я хочу удалить, верно?
Correct.
4: Когда я удаляю сокет, используя FD_CLR (), есть ли предпочтительный способ сброса Max File Descriptor (nfds)?
Не совсем, просто пересканируй и пересчитай. Но на самом деле не нужно , чтобы на самом деле его сбросить.
5: скажем, у меня есть все мои подключенные сокеты в векторе, когда select () возвращает, я могу просто пройти через этот вектор и проверить, если (FD_ISSET (theVector [loopNum], & readFileSet)) посмотреть, нужны ли какие-либо данные читать, правильно?
Правильно, но более обычным является итерация самого набора FD.
И если это возвращает true, я могу просто использовать ту же самую функцию приема, которую я использовал на своих синхронных сокетах, чтобы получить эти данные?
На ваших блокирующих розетках, да.
6: Что произойдет, если select () попытается прочитать из закрытого сокета?
select()
не 'не пытается читать из закрытого сокета. Он может попытаться выбрать для закрытого сокета, в этом случае он вернет -1 с помощью errno == EBADF
, как указано в документации.
Я знаю, что он возвращает -1, но он устанавливает errno или есть какой-то другой способ, которым я могу продолжать использовать select ()?
См. Выше.