Что происходит при отправке пустой строки с помощью sctp_recvmsg() в сокет SCTP SOCK_STREAM?

Как упоминалось в функция получения сообщения SCTP, возвращающая ноль, sctp_recvmsg() возвращает длину из 0 для индивидуального соединения SCTP ( socket(PF_INET, SOCK_STREAM, IPPROTO_SCT)), когда другая сторона закрывает соединение.

Что происходит/должно происходить для реализации, соответствующей стандартам, когда я отправляю пустую строку ("") с sctp_sendmsg() через такое соединение?

  • (Как) Получающая сторона различает, закрыл ли я соединение или просто отправил пустую строку/
  • Или запрещено отправлять пустую строку?

Я пока не встречал ничего, объясняющего это.

EDIT: я должен упомянуть, что для стандартных recv() из SOCK_STREAM (например, для TCP) получение буфера нулевой длины происходит когда одноранговый узел выполнил упорядоченное завершение работы, поэтому очевидно вы повторно не разрешено send() пустую строку в TCP. Для потокового протокола, такого как TCP, это имеет смысл, поскольку данные нулевой длины не могут иметь смысла в потоке. Но это вполне может иметь значение для дейтаграммы, как в случае с sctp_recvmsg(), поэтому мы не можем сказать "это точно так же, как для TCP".


person nh2    schedule 08.08.2015    source источник
comment
В TCP пустая отправка не может быть обнаружена удаленной стороной. Это законно.   -  person usr    schedule 09.08.2015
comment
По крайней мере, реализация Linux не позволит вам отправить сообщение нулевого размера, это не удастся с EINVAL. (Хотя вы можете предоставить пустое сообщение, если вы закрываете/прерываете соединение, путем предоставления вспомогательной структуры SCTP_SNDRCV в вызове sendmsg() с установленным флагом SCTP_EOF или SCTP_ABORT)   -  person nos    schedule 09.08.2015
comment
@usr Верно. На самом деле это полезный способ проверки состояния соединения. Происходит вся проверка ошибок, но ничего не передается по сети или даже в буфер отправки сокета.   -  person user207421    schedule 09.08.2015