Использование UDP-сокета с опросом. Блокировка против неблокирования - PullRequest
0 голосов
/ 31 мая 2019

Можно найти множество примеров о неблокирующих сокетах 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. Является это поведение отличается для блокирующих / неблокирующих сокетов.

...