проблема с udp broadcast (не отправляется пакет на адрес INADDR_BROADCAST)

Модератор: Модераторы разделов

vja
Сообщения: 8
ОС: ubuntu 7.10

проблема с udp broadcast

Сообщение vja »

Можно ли отправлять широковещательные пакеты используя INADDR_BROADCAST?
под виндами работает на ура, под линуксом только при указании широковещательного адреса с маской подсети, например 10.255.255.255, задача чтобы рассылка пакетов шла в независимости от сетевых настроек, либо как другой вариант решения проблемы - как программно узнать маску подсети?

зы самый злой вариант уже брать этот адрес в качестве аргумента...

инициализация сокета:

Код: Выделить всё

...
sock = socket(AF_INET,SOCK_DGRAM,0);
sockaddr_in local_addr;
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
local_addr.sin_port = htons(port);
int broad = 1;
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *) &broad, sizeof(broad));
bind(sock,(struct sockaddr*) &local_addr, sizeof(local_addr));
...


отправка пакета:

Код: Выделить всё

...
sockaddr_in broad;
broad.sin_addr.s_addr = htonl(INADDR_BROADCAST); //inet_addr("10.255.255.255");
broad.sin_family = AF_INET;
broad.sin_port = htons(205);
sendto(sock, data, data_size, 0, (sockaddr*)&broad, sizeof(sockaddr_in));
...
Спасибо сказали:
vja
Сообщения: 8
ОС: ubuntu 7.10

Re: проблема с udp broadcast

Сообщение vja »

получить информацию о сети можно используя ioctl (http://publib.boulder.ibm.com/infocenter/s..._operations.htm)

но ioctl выдает 'no such device', в чем ошибка?

Код: Выделить всё

    struct ifreq ifr;
    int s = socket(AF_INET, SOCK_DGRAM, 0);
    if (s < 0) perror("socket");
    if (ioctl(s, SIOCGIFBRDADDR, (caddr_t)&ifr, sizeof(struct ifreq))<0)    perror("ioctl");
/*
        sockaddr_in sin;
    memcpy(&sin, &ifr.ifr_broadaddr, sizeof(sockaddr_in));
    cout << inet_ntoa(sin.sin_addr) << endl;
*/
    return EXIT_SUCCESS;
}
Спасибо сказали:
vja
Сообщения: 8
ОС: ubuntu 7.10

Re: проблема с udp broadcast

Сообщение vja »

все, трабл решен - необходимо было в струкутру ifreq записать название устройства,

Код: Выделить всё

strcpy(ifr.ifr_name, "eth0");
Спасибо сказали: