Используйте системный вызов write() для отправки широковещательной рассылки UDP

Я занимаюсь программированием на платформе Linux.

Я хочу сделать UDP-трансляцию.

Я установил параметр сокета SO_BROADCAST, когда я вызываю системный вызов sendto(), он отлично отправляет широковещательную рассылку, но когда я использую bind() для привязки дескриптора сокета к адресу назначения и вызываю системный вызов write(), он вызывает сообщение об ошибке:

Destination address required

Пожалуйста, дайте мне несколько советов, спасибо!


person bigpotato    schedule 23.06.2014    source источник
comment
bind() используется для установки источника, то есть для привязки к локальному интерфейсу, через который вы хотите отправлять данные. bind() не используется для определения целевого адреса.   -  person alk    schedule 23.06.2014
comment
И в любом случае, в чем проблема с использованием sendto()?   -  person user207421    schedule 23.06.2014


Ответы (1)


bind() не устанавливает адрес назначения, а устанавливает локальный (исходный) адрес.

Вам нужно использовать connect(), чтобы установить адрес назначения.

UDP, конечно, не требует установления соединения, но вызов connect() позволит вам связать сокет с удаленным адресом — это позволит вам использовать write() и send() в сокете. Однако в этом случае сокет будет принимать только входящие сообщения, приходящие с адреса, указанного вами в connect(), что может быть нежелательно для широковещательного трафика, поскольку никогда не должно быть сообщений, приходящих с широковещательного адреса.

person nos    schedule 23.06.2014