Еще вопросы об асинхронных сокетах: - PullRequest
0 голосов
/ 09 марта 2011

Начальные вопросы здесь

Итак, я читал об асинхронных сокетах, и у меня есть еще пара вопросов. В основном бетон.

1: я могу использовать блокирующий сокет с select () без последствий, правильно?

2: Когда я использую FD_SET (), я добавляю текущий fd_set *, не меняя его, правильно?

3: при использовании FD_CLR () я могу просто передать идентификатор сокета сокета, который я хочу удалить, верно?

4: Когда я удаляю сокет, используя FD_CLR (), есть ли предпочтительный способ сброса Max File Descriptor (nfds)?

5: скажем, у меня есть все мои подключенные сокеты в векторе, когда select () возвращает, я могу просто пройти через этот вектор и проверить if (FD_ISSET (theVector[loopNum], &readFileSet)) , чтобы увидеть, нужно ли читать какие-либо данные, правильно? И если это возвращает true, я могу просто использовать ту же самую функцию приема, которую я использовал на своих синхронных сокетах, чтобы получить эти данные?

6: Что произойдет, если select () попытается прочитать из закрытого сокета? Я знаю, что он возвращает -1, но он устанавливает errno или есть какой-то другой способ, которым я могу продолжать использовать select ()?

7: Почему ты такой классный? = D


Я ценю ваше время, извините за головную боль, и я надеюсь, что вы можете помочь!

Ответы [ 2 ]

0 голосов
/ 03 мая 2017

Итак, я читал об асинхронных сокетах

Судя по тому, что следует, я не думаю, что у вас есть. Вы, кажется, читали о неблокирующих сокетах. Не то же самое.

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 ()?

См. Выше.

0 голосов
/ 09 марта 2011
  1. Да
  2. Неясно?FD_SET вставляет сокет в набор.Если сокет уже существует, ничего не меняется.
  3. FD_CLR удаляет сокет из набора, если сокета там нет, ничего не меняется
  4. Вы можете сохранить параллельный набор <> сокетов,тогда получите самое высокое значение оттуда.Или вы можете просто установить bool, говорящий «rescan for nfd перед следующим выбором» (ПРИМЕЧАНИЕ. В Windows nfd игнорируется)
  5. Исправить
  6. Если выбор не удался, быстрое решение состоит в том, чтобы выполнить итерации сокетов ивыберите () на каждом из них по одному, чтобы найти поддельного.Оптимально, ваш код не должен позволять select () для сокета , который вы закрыли, хотя, если другой конец закрыт, его вполне допустимо выбирать.
  7. Мне нужно, чтобы вы поговорили смоя жена.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...