Я пишу здесь, потому что, хотя вопрос старый. Он как-то появился в моем поиске в Google и определенно не получил правильного ответа.
Принятый ответ лишь выдвигает на первый план два преимущества использования неблокирующих сокетов, но в действительности не углубляется в детали и не отвечает на реальный вопрос.
- ПРИМЕЧАНИЕ. К сожалению, большинство онлайновых «учебных пособий» или фрагментов кода содержат только блокирующий код сокетов, поэтому знания о неблокирующих сокетах распространяются меньше.
Относительно того, когда вы будете использовать один по сравнению с другим ... в общем случае блокирующие сокеты используются только в онлайн-фрагментах кода. Во всех (хороших) производственных применениях используются неблокирующие розетки. Я не знаю, если вы знаете о реализации, которая использует блокирующие сокеты (и уверены, что это очень хорошо возможно в сочетании с потоками) - или давайте будем более конкретны, если использовать блокирующие сокеты в одном потоке - пожалуйста, позвольте я знаю.
Теперь я могу привести очень простой для понимания пример, и есть много других. Давайте возьмем пример игрового сервера. Игры развиваются в тиках, через регулярные промежутки времени, когда состояние игры изменяется, независимо от того, предоставляет игрок ввод (мышь / клавиатура) для изменения состояния игры. Теперь, когда сокеты вступают в игру в многопользовательских играх - если бы вы использовали блокирующие сокеты, состояние игры не улучшалось бы, если бы игроки не отправляли обновления - поэтому, если у них есть проблемы с интернетом, состояние игры никогда не будет постоянно обновляться и распространять изменения среди всех игроков , У вас был бы довольно изменчивый опыт.
Теперь, используя неблокирующие сокеты, вы можете запустить игровой сервер в однопоточном режиме, обновив состояние игры, а также сокеты, с ... скажем, интервалом тайм-аута 50 мс - и данные сокетов считываются только из подключенные пользователи, когда они действительно что-то отправляют, а затем подают на сервер симуляции, обрабатывают и подают в расчет состояния игры для следующего тика.