На странице руководства говорится о сообщении (единственном числе) и нескольких элементах (множественном числе):
Для send()
и sendto()
сообщение находится в buf
и имеет длину len
.Для sendmsg()
на сообщение указывают элементы массива msg.msg_iov
.Вызов sendmsg()
также позволяет отправлять вспомогательные данные (также известные как управляющая информация).
Для потокового сокета это не имеет значения в любом случае.Любые данные, которые вы отправляете, просто превращаются в один длинный поток данных на другой стороне.
Для дейтаграмм или сокетов сообщений я понимаю, почему немного большей ясности было бы полезно.Но похоже, что вы отправляете только одну дейтаграмму или сообщение с помощью одного sndmsg
вызова;не один на элемент буфера.
Я на самом деле копался в исходном коде Linux из любопытства, чтобы лучше понять этот ответ.Похоже, send
и sendto
- это просто оболочки для sendmsg
в Linux, которые создают для вас struct msghdr
.И на самом деле, реализация UDP sendmsg
освобождает место для одного заголовка UDP на sendmsg
вызов.
Если вы беспокоитесь о производительности, она не выглядитВы получите sendmsg
, если сдадите только один iovec
.Однако, если вы объединяете буферы в пользовательском пространстве, это потенциально может вас выиграть.
Это немного похоже на writev
, но с дополнительным преимуществом вы можете указать адрес назначения для использования с без установления соединения.сокеты типа UDP.Вы также можете добавить вспомогательные данные, если вам нравятся подобные вещи.(Обычно используется для отправки файловых дескрипторов через доменные сокеты UNIX.)