Является ли хорошей идеей ВСЕГДА использовать select () или poll () и, скажем, устанавливать 10-секундный тайм-аут для вызовов send () и recv ()? Или я должен просто позволить им блокировать на неопределенный срок?
Приводит ли такой тайм-аут (использование select () или poll ()) к потере каких-либо отчетов об ошибках или функций (в форме возвращаемых значений), которые я могу получить, просто используя send () и recv ()?
ПРИМЕЧАНИЕ. Предполагается, что я опрашиваю в том же потоке непосредственно перед вызовом recv () или send (). И вызов poll () статически хорошо отформатирован, то есть параметры не изменяются динамически, кроме как в зависимости от вызова обернутой функции recv () или send ().
ДРУГОЕ ПРИМЕЧАНИЕ: если есть тайм-аут, то я сгенерирую исключение и позволю программисту его перехватить. Я надеялся, что это приведет к защите от атаки DOS. Если действительно есть тайм-аут. Я сгенерирую исключение и не буду вызывать ни recv (), ни send ()
ДАЙТЕ ДРУГОЕ ПРИМЕЧАНИЕ: Исходный код, связанный с тем, о чем я говорю, может быть найден здесь https://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#faq под аналогичным FAQ
Спасибо!
Что вы собираетесь делать после истечения времени ожидания? Если вы снова начнете ждать, тайм-аут ничего не даст.
Если вы закроете соединение и заклейте его как мертвое, тайм-аут очень полезен.
select () и poll () просто сообщают вам, из каких файловых дескрипторов готовы читать. Как только вы узнаете, какие файловые дескрипторы готовы, вы все равно можете вызвать для них функцию recv (), так что вы получите те же возвращаемые значения / проверку ошибок в любом случае.
Вам действительно нужно использовать select () или poll (), только если у вас есть несколько сокетов / файловых дескрипторов для чтения. Если все, что вам нужно, это тайм-аут для одного сокета, то вы можете использовать setsockopt () с опцией SO_RCVTIMEO, чтобы позволить вызову recv () истечь. Увидеть этот ответ.
Ответ на вопрос, начинающийся с «Это хорошая идея для ВСЕГДА», часто — «нет». Здесь ответ зависит от того, как вы poll()
Так что нет, это не всегда хорошая идея.
если ты poll()
в отдельном потоке, целью которого является только ждать данных, тайм-аут не будет ничего делать.
Если вы используете сокеты в синхронном доступе, то вы должны использовать таймауты. Но лучше, но сложнее было бы использовать их асинхронно. Таким образом, работая в своем собственном потоке, они могут блокировать и использовать наименьшее количество ресурсов …