Как транслировать через сокеты UDP?

Я пытаюсь транслировать сообщения через зарегистрированный несколько клиентов по протоколу UDP.

Я считаю, что нам нужны две команды для отправки и получения через сокеты:

sendto(sock,buffer,
            strlen(buffer),0,(const struct sockaddr *)&server,length);

recvfrom(sock,buffer,256,0,(struct sockaddr *)&from, &length);

Как мы видим, нам нужно 6 аргументов для одного и того же, предпоследним является адрес получателя. В случае клиента на сервер у нас есть адрес. Но от сервера к клиенту у нас есть только адрес последнего клиента, от которого пришло сообщение.

Я также попытался сохранить адреса всех сокетов, которые подключаются к серверу хотя бы один раз, чтобы мы могли использовать sendto(), но, поскольку все клиенты работают на одной машине, это &from кажется одинаковым.

Какие есть альтернативы? Где я ошибаюсь? Я просто хочу передать сообщение всем клиентам, работающим на локальной машине. ?


person mkkhedawat    schedule 02.02.2015    source источник
comment
Я запутался. Вы имеете в виду multicast вместо broadcast?   -  person Sourav Ghosh    schedule 02.02.2015
comment
Я хочу отправить сообщение всем клиентам одновременно.   -  person mkkhedawat    schedule 02.02.2015
comment
проверьте структуру struct sockaddr_in. Есть нечто, называемое номер порта [sin_port].   -  person Sourav Ghosh    schedule 02.02.2015
comment
Это было бы то же самое для подключения, верно? Так как есть только один сервер.   -  person mkkhedawat    schedule 02.02.2015
comment
Так? ваша проблема на стороне сервера, я прав? Пожалуйста, добавьте дополнительную информацию и локализуйте свою проблему.   -  person Sourav Ghosh    schedule 02.02.2015
comment
@Manish Вы можете сделать это двумя способами: IP-трансляция или IP-многоадресная рассылка, когда вы отправляете на специальный IP-адрес, от которого клиенты также должны быть готовы получать. IP-трансляция может выполняться только в одной и той же IP-подсети (LAN), IP-многоадресная рассылка может выходить за пределы одной IP-подсети (но для этого требуется специальная настройка ваших маршрутизаторов). Сначала вам нужно выбрать один из этих двух методов. Или вы выполняете трансляцию самостоятельно в коде, но вызываете sendto() в цикле для каждого из ваших клиентов.   -  person nos    schedule 02.02.2015
comment
@nos, спасибо за ваше время. Все они находятся в одной подсети. на той же машине правильнее будет. Когда вы говорите, специальный IP, не могли бы вы уточнить. Также, как я уже сказал, я не могу использовать sendto() в цикле, так как у каждого клиента один и тот же адрес.   -  person mkkhedawat    schedule 02.02.2015
comment
@SouravGhosh Думаю, вы неправильно поняли мой вопрос. Я не получаю никакой ошибки. Я просто не знаю, как поступить со своей идеей.   -  person mkkhedawat    schedule 02.02.2015
comment
Возможно, вы можете найти некоторые подсказки в этом вопросе: с   -  person nos    schedule 02.02.2015
comment
Но. Это отправитель и адрес. Он ничего не комментирует на стороне получателя. как будут получать все клиенты, если они будут отправлены на один адрес и порт. Меня больше беспокоят несколько приемников.   -  person mkkhedawat    schedule 02.02.2015


Ответы (1)


Отправка широковещательных сообщений UDP может быть запрещена по умолчанию вашей реализацией сетевого стека. Вам необходимо включить трансляцию в некоторых средах:

int allow_broadcast = 1;
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (void*) &allow_broadcast, sizeof(allow_broadcast));

Фактический список параметров setsockopt должен быть доступен в документации вашей ОС, например 1 или 2.

person harper    schedule 02.02.2015