2010-06-01 3 views
3

Я использую BSD-сокетов в Ubuntu 9.10 для отправки пакетов UDP в эфир с помощью следующего кода:UDP сокеты в специальной сети (Ubuntu 9.10)

 sock_fd = socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP); 
     //sock_fd=socket(AF_INET,SOCK_DGRAM,0); 
     receiver_addr.sin_family = PF_INET; 
     //does not send with broadcast in ad hoc 
     receiver_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST); 
     inet_aton("169.254.255.255",&receiver_addr.sin_addr); 
     receiver_addr.sin_port = htons(port); 
     int broadcast = 1; 
      // this call is what allows broadcast packets to be sent: 
      if (setsockopt(sock_fd, SOL_SOCKET, SO_BROADCAST, &broadcast, 
       sizeof broadcast) == -1) { 
       perror("setsockopt (SO_BROADCAST)"); 
       exit(1); 
      } 
     ret=sendto(sock_fd, packet, size, 0,(struct sockaddr*)&receiver_addr,sizeof(receiver_addr)); 

Обратите внимание, что не весь код, это только иметь идею.

Программа отправляет все данные с помощью INADDR_BROADCAST, если я подключен к беспроводной сети инфраструктуры. Однако, если мой ноутбук подключен к сети ad-hoc, он может получать все данные, но не отправлять их. Я решил проблему, используя широковещательный адрес 169.254.255.255, но я хотел бы знать, что происходит.

Спасибо заранее!

+0

«Не отправлять» означает, что функция возвращает ошибку или другие компьютеры в сети не видят этот пакет? –

+0

Попробуйте tcpdump или wirehark и сообщите нам, что происходит .. Как вы заключаете, что вы не можете отправлять пакеты? – Jack

+0

Он возвращает -1 ... извините за поздний ответ! – Ekhiotz

ответ

2

У вас есть более одного адаптера (т. Е. Проводной Ethernet, WLAN)?

При отправке на ограниченный широковещательный адрес (INADDR_BROADCAST) ваш IP-стек использует первый адаптер и отправляет кадр. У вас нет контроля над выбором конкретного адаптера. IP-стек выполнил свою работу, когда он отправил первому найденному адаптеру. Кадр будет затоплен по всему Интернету, если это не будет предотвращено маршрутизаторами. Вот почему по умолчанию UDP-трансляция не маршрутизируется. (Исключения существуют, как реализовано в реле DHCP.)

Когда вам нужно отправить фрейм UDP в определенной сети, вам нужен сетевой широковещательный адрес. Вы сделали это уже, когда вы отправляете 169.254.255.255 в сеть AUTOIP.

Установочный набор (SOL_SOCKET, SO_BROADCAST) просто настраивает сокет, чтобы разрешить отправку широковещательной передачи вообще.

Смежные вопросы