Можно ли настроить многоадресный сокет UDP таким образом, чтобы функция write () могла вызываться вместо sendto ()? - PullRequest
2 голосов
/ 11 марта 2019

Я пишу приложение многоадресной рассылки C ++ в Linux Ubuntu.

В моем классе отправителя многоадресной рассылки C ++ я делаю это:

uint16_t port = 5678;
const char* group = "239.128.128.128";

int fd = socket(AF_INET, SOCK_DGRAM, 0);

struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(group);
addr.sin_port = htons(port);

const char* buf = "Hi there";
size_t bytes_to_write = 8;

size_t bytes_sent = sendto(fd, buf, bytes_to_write, 0, (struct sockaddr*) &addr, sizeof(addr));

Есть ли способ настроить дескриптор файла так, чтобыЯ могу вызвать write (), а не sendto ()?Я бы подумал, что будет опция setsockopt или подобное, чтобы сделать это?

1 Ответ

2 голосов
/ 11 марта 2019

Да.

Согласно документации man 7 udp

При вызове connect (2) для сокета устанавливается адрес назначения по умолчанию идатаграммы теперь можно отправлять с помощью send (2) или write (2) без указания адреса назначения.

и, в общем, спецификация POSIX для connect говорит

Если исходный сокет не находится в режиме соединения, то connect () должен установить адрес узла сокета, и соединение не устанавливается.Для сокетов SOCK_DGRAM адрес однорангового узла определяет, куда все дейтаграммы отправляются последующими функциями send (), и ограничивает удаленного отправителя для последующих функций recv ().

Всегда стоит проверить документацию для них,Вещи, это не , что непроницаемые.FWIW Я не мог сразу вспомнить, нужно ли вам connect() или bind() для этого, и мне потребовалось несколько секунд, чтобы выяснить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...