Можно найти множество примеров о неблокирующих сокетах TCP, однако мне трудно найти хорошее объяснение того, как UDP-сокеты должны обрабатываться с помощью системных вызовов poll/select/epoll
.
- Блокирует или не блокирует?
Когда нам приходится иметь дело с сокетами tcp, тогда имеет смысл установить их на неблокирующие, поскольку требуется только одно медленное клиентское соединение, чтобы сервер не обслуживал других клиентов. Однако в UDP нет сообщений ACK, поэтому я предполагаю, что запись в UDP должна быть достаточно быстрой в обоих случаях. Означает ли это, что мы можем безопасно использовать блокирующий UDP-сокет с семейством системных вызовов poll
, если каждый раз собираемся отправлять небольшой объем данных (например, 10 КБ)? Из этого обсуждения я предполагаю, что ARP-запрос - это единственная точка, которая может существенно блокировать функцию sendto
, но разве это не разовая вещь?
- Возвращаемое значение sendto
Скажем, сокет неблокируемый. Может ли быть сценарий, когда я пытаюсь отправить 1000 байтов данных, а функция sendto отправляет только некоторую их часть (скажем, 300 байтов)? Означает ли это, что он только что отправил пакет UDP с 300 байтами, и в следующий раз, когда я использую sendto, я должен учитывать, что он снова отправит новый пакет UDP? Возможна ли эта ситуация для блокировки сокетов?
- Возвращаемое значение recvfrom
Тот же вопрос относится к recvfrom. Может ли быть ситуация, что мне нужно будет вызывать recvfrom более одного раза, чтобы получить полный пакет UDP. Является
это поведение отличается для блокирующих / неблокирующих сокетов.