UDP-сокеты в специальной сети (Ubuntu 9.10) - PullRequest
3 голосов
/ 01 июня 2010

Я использую сокеты BSD в Ubuntu 9.10 для отправки пакетов UDP в широковещательной рассылке со следующим кодом:

        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, если я подключен к инфраструктуре беспроводной сети. Однако, если мой ноутбук подключен к специальной сети, он может получать все данные, но не отправлять их. Я решил проблему, используя широковещательный адрес 169.254.255.255, но я хотел бы знать, что происходит.

Заранее спасибо!

1 Ответ

2 голосов
/ 01 июня 2010

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

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

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

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

...