Объединение sento() написать writev()?
Я установил сокет udp и вызывал sendto () с разными получателями при каждом вызове.
Я хотел бы использовать writev(), чтобы использовать scater/ collect io, но writev() не позволяет мне указать адрес / порт получателя, как в sendto(). Какие-либо предложения?
1 ответ
Ты можешь использовать writev
отправить объединенный набор буферов в одну конечную точку, если вы используете connect
указать конечную точку заранее. Из справочной страницы (OSX) для connect(2)
:
сокеты датаграмм могут использовать connect() несколько раз, чтобы изменить их связь
Вы не можете использовать writev
отправить каждый буфер в другую конечную точку.
Потенциальный недостаток использования connect / writev
вместо sendto
*n в том, что это еще один системный вызов writev
,
Если набор получателей ограничен (и известен заранее), может быть предпочтительнее использовать отдельный socket
на получателя и просто connect
каждый сокет один раз.
В Linux есть sendmmsg(2)
Системный вызов sendmmsg() - это расширение sendmsg(2), которое позволяет вызывающему абоненту передавать несколько сообщений через сокет с помощью одного системного вызова. (Это дает преимущества в производительности для некоторых приложений.)
Прототип:
int sendmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen,
unsigned int flags);
struct mmsghdr {
struct msghdr msg_hdr; /* Message header */
unsigned int msg_len; /* Number of bytes transmitted */
};
Поскольку и адрес, и вектор ввода-вывода указаны в struct msghdr
, вы можете как отправлять по нескольким адресатам, так и использовать scatter/gather.