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 адресом.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.