UDP транслируется и одноадресно через один и тот же сокет? - PullRequest
1 голос
/ 29 апреля 2009

У меня есть приложение Linux, которое открывает сокет UDP и привязывает его к порту. У меня не было проблем с отправкой одноадресных пакетов через сокет. У меня была возможность отправить широковещательный пакет, поэтому я включил SO_BROADCAST, что позволило передавать широковещательные пакеты, но затем я заметил, что одноадресные пакеты также транслируются. Это ожидаемое поведение для сокета UDP или более вероятно, что я что-то неправильно настроил?

Ответы [ 3 ]

2 голосов
/ 29 апреля 2009

Из того, что я понимаю SO_BROADCAST - опция сокета. Так что если вы включите его на своем сокете, этот сокет будет транслироваться. Я думаю, вам нужно будет открыть разные сокеты, если вы хотите сделать одноадресную передачу и транслировать с одного и того же кода.

0 голосов
/ 22 июля 2009

Я обнаружил ту же проблему в Linux, когда сокет получал одноадресную и широковещательную рассылку одновременно. Я решил проблему следующим образом (псевдокод):

  1. sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
    • Открыть розетку
  2. setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &1)
    • Разрешает входящую и исходящую трансляцию из этого сокета
  3. bind(sock, bindaddr, sizeof(struct sockaddr) с

bindaddr.sin_family = AF_INET

bindaddr.sin_port = <YourPort>

bindaddr.sin_addr.s_addr = INADDR_ANY

  • Получить все входящие сообщения на любую карту за <YourPort>

Предостережение заключается в том, что фильтрация отсутствует (см. Предостережение в 3.). Таким образом, вы получите все сообщения. Отправленные сообщения либо одноадресные, либо транслируются по указанному адресу в sendto().

0 голосов
/ 29 апреля 2009

Я не особо разбирался в программировании, но вам, вероятно, нужно предоставить больше информации о библиотеке, версии ОС, коде и т. Д. Может быть, пример кода?

Если я помню книги, которые я прочитал, если вы установите флаг на сокете, это повлияет на все дейтаграммы, отправленные с сокета, потому что сокет - это в основном структура данных сетевых флагов + дескриптор файла. 1003 *

...