И снова броадкаст (broadcast)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Tarik
Агент Системы
Агент Системы
Аватара пользователя
 
Сообщения: 1222
Зарегистрирован: 03.01.2003 (Пт) 16:05
Откуда: Москва

И снова броадкаст (broadcast)

Сообщение Tarik » 07.05.2004 (Пт) 21:51

Да, это снова он :) Как ни искал я по нашему форуму нашим "творческим" поиском, так ничего внятного и не нашёл. Так вот, хотелось бы подробно узнать: как организовать броадкаст (по сегменту локалки в частности) :?: Насколько я понял, тут надо юзать UDP. А вот в какую сторону его юзать? Не пойму...
Изображение

Ever tried? Ever failed? No matter. Try again! Fail again! Fail better!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.05.2004 (Вт) 10:16

Создаешь UDP-сокет и отсылаешь сообщение на Broadcast-адрес. Только есть некоторые ограничения. Во-первых, длина такого сообщения не может превышать определенных размеров, API-шку не помню, есть какая-то, которая возвращает характеристики транспорта. Исходи из того, что в лучшем случае это будет несколько килобайт. Во-вторых, адрес. Конкретный адрес зависит от маски подсети. Если твоя сеть имеет адрес 192.168.1.0 и маску 255.255.255.0 (т.е. диапазон от 192.168.1.1...192.168.1.254), то для этого случая броадкаст будет 192.168.1.255. В общем случае, те разряды, где маска установлена, должны соответствовать адресу сети, там где маска не установлена, должны быть единицы. Или, в виде формулы, Broadcast = (NetAddress AND Mask) OR (NOT Mask AND 255.255.255.255). Имеется "общий" броадкаса 255.255.255.255, но в многосегментных сетях обычно он никуда не пройдет.
Lasciate ogni speranza, voi ch'entrate.

Tarik
Агент Системы
Агент Системы
Аватара пользователя
 
Сообщения: 1222
Зарегистрирован: 03.01.2003 (Пт) 16:05
Откуда: Москва

Сообщение Tarik » 11.05.2004 (Вт) 21:32

Ага, понятно... А как эти броадкасты ловить? Т. е. у меня сеть сервак, клиент посылает броадкаст на весь сегмент, а все включенные серваки должны откликнуться. Как такое организовать?
Изображение

Ever tried? Ever failed? No matter. Try again! Fail again! Fail better!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 12.05.2004 (Ср) 9:35

На клиентах ставишь сокеты на прослушку определенного порта и ловишь.
При этом учитывай, что UDP вовсе не гарантирует, что данные куда-то дойдут, было как-то одно образное сравнение протоколов TCP и UDP.
TCP это как телефон, т.е. нужно снять трубку и куда-либо позвонить и только после того, как на том конце поднимут трубку (произойдет коннект) ты можешь говорить. Зато все, что ты говоришь, пойдет именно тому, кому ты это говоришь.
А UDP это как кричать в большой комнате. Т.е. тебе не надо снимать трубку и набирать номер, ты просто говоришь в пространство, а все, кто тебя услышат, могут откликнуться. А могут и не откликнуться. Т.е. ты не знаешь, услышал ли тебя кто-нибудь.

Для того, что тебе надо, клиент посылает броадкаст, а затем в течении какого-то времени (скажем три секунды) слушает ответы (вроде бы Bind). И все, кто за этот период успеет ответить, заносяться в список серверов.

Вообщем не помню, нужен Bind или Listen, сейчас смотреть негде, а в MSDN слишком долго копаться.
Lasciate ogni speranza, voi ch'entrate.

Tarik
Агент Системы
Агент Системы
Аватара пользователя
 
Сообщения: 1222
Зарегистрирован: 03.01.2003 (Пт) 16:05
Откуда: Москва

Сообщение Tarik » 13.05.2004 (Чт) 8:19

Спасибо за доступное объяснение! Наконец-то всё понял :) Пойду пробовать...
Изображение

Ever tried? Ever failed? No matter. Try again! Fail again! Fail better!

Tarik
Агент Системы
Агент Системы
Аватара пользователя
 
Сообщения: 1222
Зарегистрирован: 03.01.2003 (Пт) 16:05
Откуда: Москва

Сообщение Tarik » 14.05.2004 (Пт) 18:46

Чё-то не пойму я :( Либо я совсем думать разучился, либо одно из двух :) Вот как я делаю:
Код: Выделить всё
Private Sub Form_Load()
...
wskListen.Bind
End Sub

Private Sub wskListen_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
wskListen.GetData strData
MsgBox strData
End Sub

Код: Выделить всё
Private Sub Command1_Click ()
wskSearch.RemoteHost = "10.105.9.255"
wskSearch.SendData "Some test data"
End Sub

В итоге сервером ничего не ловится :(
Изображение

Ever tried? Ever failed? No matter. Try again! Fail again! Fail better!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.05.2004 (Пт) 20:32

А порты одинаковые? Сокет - это IP плюс порт, если у тебя сервер слушает другой порт, то ты ничего и не услышишь.

Кстати, а UDP-сообщения вообще принимаются? Попробуй отправлять не на броадкаст-адрес, а на IP машины, дойдут или нет? Дело в том, что для того, чтобы сокет мог отправлять широковещательные сообщения, надо изменить его параметры (что-то вроде API SetSocketOptions).
Lasciate ogni speranza, voi ch'entrate.

Tarik
Агент Системы
Агент Системы
Аватара пользователя
 
Сообщения: 1222
Зарегистрирован: 03.01.2003 (Пт) 16:05
Откуда: Москва

Сообщение Tarik » 15.05.2004 (Сб) 15:08

И впрям порт не поставил :oops: Привык, что в TCP при коннекте порт указывается, а тут... В общем, ступил :oops:
Зато теперь всё пашет 8) Ещё раз большое спасибо!
Изображение

Ever tried? Ever failed? No matter. Try again! Fail again! Fail better!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20

    TopList