Как написать функцию опроса всех компов в сети(широковещательный запрос). Мне нужно, чтобы программа сокет-клиент могла найти самостоятельно др. прогу — сокет-сервер. Как это сделать? Можно даже привести пример прямо здесь...
Здравствуйте, SaNTa_RnD, Вы писали:
SNT>Как написать функцию опроса всех компов в сети(широковещательный запрос). Мне нужно, чтобы программа сокет-клиент могла найти самостоятельно др. прогу — сокет-сервер. Как это сделать? Можно даже привести пример прямо здесь...
Это делается на UDP сокетах
Со своей стороны
bindишь сокет на какой-то порт (обычно заранее оговоренный) и посылаешь пакет (
sendto) на какой-то
оговоренный порт с IP адресом получателя
INADDR_BROADCAST
Перед всем этим, но после создания сокета, следует произвести небольшую операцию — разрешить сокету broadcast сщщбщения, установить флаг
SO_BROADCAST
Небольшой пример:
SOCKET s;
sockaddr_in service;
sockaddr_in RecvAddr;
BOOL bOptVal = TRUE;
int bOptLen = sizeof(BOOL);
s = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr(" Твой IP адрес ");
service.sin_port = htons( Твой порт );
bind( s, (SOCKADDR*) &service, sizeof(service));
setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*)&bOptVal, bOptLen);
RecvAddr.sin_family = AF_INET;
RecvAddr.sin_port = htons( Твой порт или порт удаленного хоста );
RecvAddr.sin_addr.s_addr = INADDR_BROADCAST;
sendto(s, SendBuf, BufLen, 0, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr));
Теперь все компьютеры в локальной сети получат твой пакет.
Обычно порты UDP заране оговариваются, но если этого сделано не было, то следует при отправке ответа на broadcast запрос подставить тот порт, который был в запросе. Эту же операцио следует проделать и с IP адресом.
On Fri, 07 Oct 2005 03:14:17 +0400, LeonCrew <29045@users.rsdn.ru> wrote:
> Здравствуйте, SaNTa_RnD, Вы писали:
>
> SNT>Как написать функцию опроса всех компов в сети(широковещательный запрос). Мне нужно, чтобы программа сокет-клиент могла найти самостоятельно др. прогу — сокет-сервер. Как это сделать? Можно даже привести пример прямо здесь...
>
> Это делается на UDP сокетах
>
> Со своей стороны bindишь сокет на какой-то порт (обычно заранее оговоренный) и посылаешь пакет (sendto) на какой-то оговоренный порт с IP адресом получателя INADDR_BROADCAST
>
> Перед всем этим, но после создания сокета, следует произвести небольшую операцию — разрешить сокету broadcast сщщбщения, установить флаг SO_BROADCAST
Возможно, более интересным решением было бы использовать udp multicast для server discovery. Преимущества udp multicast над тупым broadcast:
udp multicast может быть маршрутизирован, т.е. местонахождение сервера не ограничивается сетью хоста.
фильтрация udp multicast может частично или полностью осуществляться железом сетевого адаптера — меньше нагружаешь остальные хосты. Для broadcast фильтрация всегда софтовая в стеке IP/UDP.
--
Maxim YegorushkinPosted via RSDN NNTP Server 1.9