Широковещательный запрос
От: SaNTa_RnD Россия  
Дата: 06.10.05 14:13
Оценка:
Как написать функцию опроса всех компов в сети(широковещательный запрос). Мне нужно, чтобы программа сокет-клиент могла найти самостоятельно др. прогу — сокет-сервер. Как это сделать? Можно даже привести пример прямо здесь...
Re: Широковещательный запрос
От: LeonCrew Беларусь  
Дата: 06.10.05 23:14
Оценка:
Здравствуйте, 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 адресом.
Re[2]: Широковещательный запрос
От: MaximE Великобритания  
Дата: 07.10.05 22:17
Оценка:
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:

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.