2015-12-30 7 views
-1

Полезно ли ВСЕГДА использовать либо select(), либо poll(), и наложить ответ на 10 секунд на вызовы send() и recv()? Или я должен просто позволить им блокировать бесконечно?Использование тайм-аутов в сокете send() и recv()

Влияет ли этот таймаут (с помощью select() или poll()) заставляет меня потерять какую-то отчетность об ошибках или функциональные возможности (в виде возвращаемых значений), которые я могу получить, просто используя send() и RECV()?

ПРИМЕЧАНИЕ. Предполагая, что я опросу в той же теме прямо перед вызовом recv() или send(). И вызов poll() статически хорошо отформатирован, т. Е. Параметры не изменяются динамически, кроме того, как они действуют на основе вызова завернутого recv() или send()

ДРУГОЕ ПРИМЕЧАНИЕ. Если есть тайм-аут, тогда Я выброшу исключение, и пусть программист поймает его. Я надеялся, что это приведет к защите от атаки DOS. Если есть действительно тайм-аут. Я сгенерирует исключение и не добраться до вызова либо ПРИЕМ() или отправить()

ОЧЕРЕДНОЙ Примечание: Исходный код, связанные с тем, что я имею в виду, можно найти здесь https://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#faq по схожему FAQ

Спасибо!

+1

Что именно вы пытаетесь решить? Что вы будете делать, если есть тайм-аут? Начать опрос снова? Или выйти? Или что-то другое? Что вы ожидаете делать, если есть какая-то другая ошибка? Что вы хотите, если принимающая сторона действительно «идет медленно», и сообщение добирается туда, но очень медленно (например, кто-то заменил быструю ссылку с гораздо более медленной)? –

+1

Можете ли вы предоставить код? –

+0

DOS атаки, как правило, «много трафика», а не «нет трафика», что и дает тайм-аут ... –

ответ

1

Что вы собираетесь делать после истечения таймаута? Если вы снова начнете ждать, чем тайм-аут ничего не даст.

Если вы закроете соединение и заклейте его брендом, то тайм-аут очень полезен.

+0

Если я планирую бросить исключение, говоря, что тайм-аут случился, это хорошая идея? – Curious

+0

@ Киз, я понятия не имею. Это хорошая идея в вашем приложении? Является ли тайм-аут исключительным случаем, когда вы абсолютно не можете терпеть его на сайте вызова, и вы не можете разумно распространять ошибку вверх по течению? – SergeyA

+0

У меня пока нет приложения, но я просто чувствую, что каждый вызов recv должен иметь какой-то тайм-аут, когда он используется в реальных сценариях правильно? – Curious

0

Ответ на вопрос, начинающийся с "Есть хорошая идея, чтобы ВСЕГДА" часто "нет". Здесь ответ зависит от того, как вы poll(), так что нет, это не всегда хорошая идея.

Если вы poll() в отдельной теме, цель которой только ждать данных, тайм-аут ничего не сделает.

+0

Предполагая, что я опросу в той же теме прямо перед вызовом recv() или send(). И вызов poll() статически хорошо отформатирован, т. Е. Параметры не изменяются динамически, кроме того, как они действуют на основе вызова завернутого recv() или send()/ – Curious

-1

Я использую сокеты в syncron aproach, тогда вам нужно использовать таймауты. Но лучше, но сложнее было бы использовать их asyncron. Итак, работая в своей нити, они могут блокировать и будут использовать наименьшие ресурсы ...

+0

Обычно плохой ответ. Во многих случаях нет необходимости выполнять операцию сокета в отдельном потоке. – SergeyA

1

select() и poll() просто скажите, какие дескрипторы файлов готовы к чтению. Как только вы узнаете, какие дескрипторы файлов готовы, вы все равно можете вызвать recv() на них, чтобы получить одинаковые возвращаемые значения/проверку ошибок в любом случае.

Вам действительно нужно использовать select() или poll(), если у вас есть несколько сокетов/дескрипторов файлов для чтения. Если вам нужен только тайм-аут в одном сокете, вы можете использовать setsockopt() с опцией SO_RCVTIMEO, чтобы разрешить вызов recv() для тайм-аута. См. this answer.

+0

Опрос имеет преимущество над SO_RCVTIMEO, поскольку этот тайм-аут настраивается на сайт. Однако этот ответ является хорошим. – SergeyA

Смежные вопросы