VariusRain
@VariusRain
музыкант-программист-конструктор

Как сделать broadcast рассылку сообщений по UDP используя Socket?

Доброго всем времени суток!

Задача, как мне кажется, просто невероятно простая, но что-то где-то я не дочитал, видимо.
Создаю USP сервер
Socket socket = new Socket( AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp );

К нему подключаются клиенты, шлют что-то, он в отдельном потоке потихоньку это что-то слушает и реагирует.
Тут всё работает.
В какой-то момент времени нужно всем клиентам рассказать, что что-то произошло.
Я по наивности своей решил, что это делается вот так:
public void Send(byte[] data) {
	socket.Send( data , data.Length, SocketFlags.Broadcast);
}

И получаю в этом месте исключение
SocketException: Предпринятая операция не поддерживается для выбранного типа объекта.


Было у меня подозрение, что косяк в том, что сокет просто занят в данный момент времени прослушиванием, поэтому ему не до отправки. Но проверка показала, что это не так.
Прошу подсказки: куда копать?

Заранее всем спасибо за советы
  • Вопрос задан
  • 1731 просмотр
Решения вопроса 1
VariusRain
@VariusRain Автор вопроса
музыкант-программист-конструктор
Сам спросил, сам ответил.
Оказывается, нужно было чуть внимательнее читать документацию, хотя там и не всё так очевидно.

Цитата с сайта майкрософт:
Если вы используете протокол без установления соединения в блокирующем режиме, SendTo будет блокироваться до отправки датаграммы. Если вы хотите отправить данные на широковещательный адрес, необходимо сначала вызвать SetSocketOption метод и установить параметр сокета в значение SocketOptionName.Broadcast . Кроме того, необходимо убедиться, что число отправленных байтов не превышает максимальный размер пакета для базового поставщика услуг. Если это так, датаграмма не будет отправлена и SendTo создаст исключение SocketException .

Как следствие:
socket.SetSocketOption( SocketOptionLevel.Socket, SocketOptionName.Broadcast, true );

Ну и применять вместо Send нужно SendTo, просто ему вместо конкретного адреса в EndPoint передавать
IPEndPoint targetEndPoint = new IPEndPoint( IPAddress.Broadcast, 27000 );
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы