sockaddr_in addr;
s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
addr.sin_addr.s_addr=inet_addr("0.0.0.0") ;
addr.sin_family=AF_INET ;
addr.sin_port=htons(BROADCASTPORT) ;
bind(s,(const sockaddr*)&addr,sizeof(addr)) ;
int b=1;
setsockopt(s, SOL_SOCKET, SO_BROADCAST, &b, sizeof(b));
addr.sin_addr.s_addr=inet_addr("255.255.255.255") ;
addr.sin_family=AF_INET ;
addr.sin_port=htons(BROADCASTPORT) ;
sendto(s, ...);
char buf[] = "helloworld";
sendto(s, buf, strlen(buf)+1,0,(sockaddr *)&addr, sizeof(sockaddr_in));
close(s);
Протокол UDP
Как запрогамировать UDP, что бы один компютер выкидывает определённые запрос и все компютеры(на которых соответстсвено запущена прога) в сети его обрабатывают.
клиент "ждет" пакета-запроса, а сервер отправляет его широковешательным пакетом.
Да вобще то он видимо про широковещательные сообщения с помощью UDP спрашивал =)
Протокол UDP здесь совершенно не при чём. Существует такая вещь, как мультикастовое вещание, и находится она не на транспортном, а на сетевом или канальном уровне модели OSI, т.е. на уровне ip или mac адресов. Хотя транспортный протопол UPD наиболее подходит для этих целей.
Если нужна работа не только в одной подсети, то также необходим маршрутизатор с поддержкой "multicast routing".
Советую копнуть в сторону протокола igmp, который как раз управляет работой многоадресного вещания в сети, и на каждом клиенте должна быть установлена соотв. служба.
Хотя, если немного пошаманить, можно применить библиотеку pcap (ну, или WinPCap), снифить трафик в сегмент сети, и реагировать на запрос к определённому ip (естественно, свободному для данного сегмента).
Имено я спрашивал про широковешательно сообщение.... :) только тогда не как не мог сообразить как же это называеться....
[QUOTE=rjx]Протокол UDP здесь совершенно не при чём. Существует такая вещь, как мультикастовое вещание, и находится она не на транспортном, а на сетевом или канальном уровне модели OSI, т.е. на уровне ip или mac адресов. Хотя транспортный протопол UPD наиболее подходит для этих целей.
Если нужна работа не только в одной подсети, то также необходим маршрутизатор с поддержкой "multicast routing".
Советую копнуть в сторону протокола igmp, который как раз управляет работой многоадресного вещания в сети, и на каждом клиенте должна быть установлена соотв. служба.
Хотя, если немного пошаманить, можно применить библиотеку pcap (ну, или WinPCap), снифить трафик в сегмент сети, и реагировать на запрос к определённому ip (естественно, свободному для данного сегмента).[/QUOTE]
wincap мне не нужен...мне надо зделать что-то похоже на получение ip.
если я понел нужен выкинуть пакет UDP с ip 255.255.255.255.
И мне нужен именно UDP нехочу сеть загружать лишней информацией. Сеть стабильно пакет дойдёт без проблем и без ошибок.
Всё это должно происходить в одной сети с одной маской
Вот этого уж точно не получится, т.к. спецификация протокола этого не позволит, кроме как через raw-socket и ручное формирование пакета. Но тут есть 2 проблемы: абсолютно никакая кросплатформенность и необходимость админских прав как на сервере, так и на клиентах.
Код:
Примерно так. Только конечно не забыть обрабатывать результат возвращаемый сетевыми функциями на предмет ошибок, что мне было лень делать в примере.
И конечно помнить, что тот адресс 255.255.255.255, на который отсылается бродкаст - зависит от настроек сети. Тоесть какие адреса в конктетной сети определенные под бродкастные сообщения.
Код:
sockaddr_in addr;
s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
addr.sin_addr.s_addr=inet_addr("0.0.0.0") ;
addr.sin_family=AF_INET ;
addr.sin_port=htons(BROADCASTPORT) ;
bind(s,(const sockaddr*)&addr,sizeof(addr)) ;
int b=1;
setsockopt(s, SOL_SOCKET, SO_BROADCAST, &b, sizeof(b));
addr.sin_addr.s_addr=inet_addr("255.255.255.255") ;
addr.sin_family=AF_INET ;
addr.sin_port=htons(BROADCASTPORT) ;
sendto(s, ...);
char buf[] = "helloworld";
sendto(s, buf, strlen(buf)+1,0,(sockaddr *)&addr, sizeof(sockaddr_in));
close(s);
s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
addr.sin_addr.s_addr=inet_addr("0.0.0.0") ;
addr.sin_family=AF_INET ;
addr.sin_port=htons(BROADCASTPORT) ;
bind(s,(const sockaddr*)&addr,sizeof(addr)) ;
int b=1;
setsockopt(s, SOL_SOCKET, SO_BROADCAST, &b, sizeof(b));
addr.sin_addr.s_addr=inet_addr("255.255.255.255") ;
addr.sin_family=AF_INET ;
addr.sin_port=htons(BROADCASTPORT) ;
sendto(s, ...);
char buf[] = "helloworld";
sendto(s, buf, strlen(buf)+1,0,(sockaddr *)&addr, sizeof(sockaddr_in));
close(s);
Примерно так. Только конечно не забыть обрабатывать результат возвращаемый сетевыми функциями на предмет ошибок, что мне было лень делать в примере.
И конечно помнить, что тот адресс 255.255.255.255, на который отсылается бродкаст - зависит от настроек сети. Тоесть какие адреса в конктетной сети определенные под бродкастные сообщения.[/QUOTE]
Пасибо...только я твой код чуть подправлю. Там есть ошибки. Я знаю что ты писла на обум. Просто малоли кто зайдёт из начинающих и не сможет его скомпить.
sockaddr_in addr;
SOCKET s;
s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
addr.sin_addr.s_addr=inet_addr("0.0.0.0") ;
addr.sin_family=AF_INET ;
addr.sin_port=htons(INADDR_BROADCAST) ;
bind(s,(const sockaddr*)&addr,sizeof(addr)) ;
const char b=1;
setsockopt(s, SOL_SOCKET, SO_BROADCAST, &b, sizeof(b));
addr.sin_addr.s_addr=inet_addr("255.255.255.255") ;
addr.sin_family=AF_INET ;
addr.sin_port=htons(INADDR_BROADCAST) ;
char buf[] = "helloworld";
sendto(s, buf, strlen(buf)+1,0,(sockaddr *)&addr, sizeof(sockaddr_in));
closesocket(s);
Все равно облом будет: ошибка WSAEACCES
Насчёт облома незнаю...у меня работает.
Кстате есть команентs INDI servers и INDI clients, так вот там и есть комапанент для UDP и одно из его свойств разрешить или запретить широковешательный пакет
Код:
addr.sin_port=htons(INADDR_BROADCAST) ;