Каковы возможные возвращаемые значения для send, sendto и sendmsg в сокете UDP на Linux? - PullRequest
2 голосов
/ 01 августа 2020

Эти функции возвращают -1 в случае ошибки и длину ввода в случае успеха. При каких условиях они могут возвращать значение меньше длины и больше или равное 0 для сокета UDP на Linux?

Этот вопрос StackOverflow аналогичен, но в контексте не- Linux RTOS. Ответы утверждают, что этого не может быть, а производитель ОС им противоречит. Этот вопрос StackOverflow похож, но в принятом ответе обсуждается только получение. Гид Биджа утверждает, что это может случиться. libuv утверждает, что не может. POSIX, похоже, не запрещает это.

Поэтому мне любопытно, какие обстоятельства, если таковые имеются, приводят к возвращаемому значению «короткой записи» для сокетов UDP на Linux? Есть ли в POSIX пункт inte rnet RF C или, который запрещает это? Может ли это произойти, например, если дейтаграмма UDP фрагментирована (отправлена ​​несколькими IP-пакетами)?

1 Ответ

2 голосов
/ 01 августа 2020

UDP - это протокол дейтаграмм, т. Е. Это не поток байтов, как TCP, но внутри протокола есть четкие границы сообщений. Эта семантика сообщения отражается при чтении, т.е. одно recv вернет одно (и полное) сообщение.

Одно сообщение (дейтаграмма) отправляется с одним send, и другого пути нет. чтобы указать границу сообщения. Но «короткая отправка» привела бы к появлению границ сообщения, которым они не принадлежат, и, следовательно, не должна быть возможна для UDP.

...