Может ли неблокирующая запись UDP вернуть меньше байтов, чем запрошено?

У меня есть приложение, которое отправляет данные от отправителя к получателю по каналу, который может работать в симплексном (одностороннем режиме )или в дуплексном режиме (двусторонний ). В симплексном режиме приложение отправляет данные по протоколу UDP, а в дуплексном — по TCP. Поскольку запись в сокет TCP может блокироваться, мы используем неблокирующий ввод-вывод (ioctl с FIONBIO -O _NONBLOCK и fcntl не поддерживаются в этом дистрибутиве )и системный вызов select ()для определения когда данные могут быть записаны. NIO используется, чтобы мы могли прервать отправку досрочно после тайм-аута, если это необходимо, если условия сети ухудшатся. Я хотел бы использовать тот же базовый код для отправки, но вместо этого переключаться между TCP/UDP с более высокой абстракцией. Это отлично работает для TCP.

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

Я новичок в программировании сокетов, поэтому, пожалуйста, простите меня, если у меня возникнут некоторые неправильные представления. Спасибо.

6
задан aig7761 25 April 2012 в 04:53
поделиться