Объединение 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.

Другие вопросы по тегам