Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 18.08.2010
Сообщений: 24

Как на VB отослать широковещательный пакет?

04.10.2010, 01:49. Показов 1600. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Никто не знает как на VB отослать широковещательный пакет...
вообще мне нужно чтобы его получили все машины в сети...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.10.2010, 01:49
Ответы с готовыми решениями:

Широковещательный пакет в локальную сеть
Всем привет! Я пишу приложение под Android, которое должно отправлять в сеть широковезательный пакет? Приложение закрывается при...

Как в Windows ( 2000, XP ) отослать пакет "как есть" ?
Добрый день. Как в Windows ( 2000, XP ) отослать пакет "как есть" ? Я нашел несколько примеров с RAW-socket'ами на C++ и Delphi ...

Как в Windows ( 2000, XP ) отослать пакет "как есть" ?
Добрый день. Как в Windows ( 2000, XP ) отослать пакет "как есть" ? Я нашел несколько примеров с RAW-socket'ами на C++ и Delphi ...

8
3 / 3 / 0
Регистрация: 12.07.2010
Сообщений: 128
08.10.2010, 13:54
Можно так:

-Сервер, с помощью функций API CreateMailslot создает Mailslot и переходит в цикл ожидания пакетов (для широковещательной работы размер пакета д.б. менее 400 байт).
Пакеты считываются с помощью ReadFile, предварительно убедившись в их наличии функцией GetMailSlotInfo;

-Клиент, с помощью функций API CreateFile открывает Mailslot, созданный сервером и работает с ним как с обычным файлом функцией WriteFile (чтение не предусмотрено - канал односторонний).
0
Comanche
08.10.2010, 15:40
Пример:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Public Function SendPopupMessage(ByVal ToComputer As String, ByVal Msg As String) As Boolean
 
    Dim secAttr As SECURITY_ATTRIBUTES
    Dim retVal As Long, Data As String, hToSlot As Long, BytesWritten As Long
    
    SendPopupMessage = False
    ComputerName = GetSenderName
    Data = ComputerName + Chr(0) + ToComputer + Chr(0) + Msg ' собирам сообщение для отправки
    MSlotName = 'messngr' ' messngr - майлслот службы сообщений
    FullSlot = '\ ' + ToComputer + 'mailslot ' + MSlotName ' собираем имя mailslot'а
    
    ' заполняем secAttr нулями:
    With secAttr
        .nLength = Len(secAttr)
        .lpSecurityDescriptor = 0
        .bInheritHandle = 0
    End With
    
    ' создаём файл, для записи данных:
    hToSlot = CreateFile(FullSlot, GENERIC_WRITE, FILE_SHARE_READ, secAttr, _
                         CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)
 
    If hToSlot <> INVALID_HANDLE_VALUE Then
        BytesWritten = 0
        retVal = WriteFile(hToSlot, ByVal Data, CLng(Len(Data)), BytesWritten, ByVal CLng(0))
        If (retVal = 0) Or (BytesWritten <> Len(Data)) Then
            SendPopupMessage = False
            ' если не удалось записать данные или размер записанных данных
            ' и данных подготовленых для отправки не совпадает то вернуть ложное значение.
        Else
            SendPopupMessage = True
        End If
    End If ' hToSlot<>INVALID_HANDLE_VALUE
    
    Call CloseHandle(hToSlot)
 
End Function
По-моему, если тут передать в ToComputer символ 'звёздочка', то сообщение уйдёт всем компам в сетке.
3 / 3 / 0
Регистрация: 12.07.2010
Сообщений: 128
09.10.2010, 05:01
А для приема сообщения нужно что-то типа
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Const MsgSize As Long = 396
 
Function Server() As Boolean
    Dim MaxMessageSize As Long
    Dim NextSize As Long
    Dim MessageCount As Long
    Dim ReadTimeout As Long
    Dim cbRead As Long
 
    Dim hServer As Long
    Dim i As Long
 
    hServer = CreateMailslot('\.mailslotmessngr', MsgSize, 15000, 0)
    If hServer = INVALID_HANDLE_VALUE Then
        MsgBox 'CreateMailslot: Error #' & GetLastError()
        Exit Function
    End If
 
    Do While True
        If CBool(GetMailslotInfo(hServer, MaxMessageSize, NextSize, MessageCount, ReadTimeout)) Then
            If CBool(MessageCount) Then
                If CBool(ReadFile(hServer, InMailslotMessage, MsgSize, cbRead, 0)) Then
                    If cbRead = MsgSize Then
'Благополучно приняли сообщение
                    Else
                        MsgBox 'ReadFile: Error #' & GetLastError()
                        Exit Function
                    End If
                Else
                    MsgBox 'ReadFile: Error #' & GetLastError()
                    Exit Function
                End If
            Else
                Sleep (100) ' Без этой строки цикл отнимает практически 100% процессорного времени
            End If
        Else
            MsgBox 'GetMailslotInfo: Error #' & GetLastError()
            Exit Function
        End If
    Loop
    CloseHandle (hServer)
    Server = True
End Function
Вместо звездочки можно указать имя домена - тогда сообщение будут
получать все компы этого домена (со звездочкой все компы сети, по крайней мере 2k-NT-xp).
Однако высокой производительности мне в подобной связке достичь не удалось, даже без Sleep(100) в 100Mb-сети что-то порядка 1Mb/s.
Если искуственно не ограничивать скорость передачи со стороны клиента
сервер начинает пропускать пакеты! Испытывал и на двух соединенных компьютерах (2k и xp).
При этом, при копировании эксплорером файлов, с учетом производительности дисковых подсистем обоих компов, скорость передачи между ними достигала свыше 6Mb/s.
Вообще для меня это больная тема: как добиться такой скорости обмена.
В настоящий момент я использую AddConnection2 и просто копирую файлы, но это криво, и приводит ко многим заморочкам.
0
Comanche
09.10.2010, 14:31
А ты попробуй вместо цикла использовать таймер:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Private Sub Timer1_Timer()
   
    Dim NextMsgSize As Long, MsgSize As Long, MsgCount As Long, retVal As Long
    Dim DummyBuffer As String
 
    timerCounter = timerCounter + 1  ' считаем секунды
    
    NextMsgSize = 0
    MsgSize = 0
    retVal = GetMailslotInfo(MailslotHandle, CLng(0), NextMsgSize, MsgCount, CLng(0))
 
    If NextMsgSize <> MAILSLOT_NO_MESSAGE Then
        If NextMsgSize > 5 Then
            ' по формату сообщение не может быть меньше 5 символов, даже от компьютера,
            ' чьё имя состоит из одной буквы.
            Call ReadMessage(NextMsgSize)
        Else
            retVal = ReadFile(MailslotHandle, DummyBuffer, ByVal NextMsgSize, MsgSize, ByVal CLng(0))
            ' считываем в ненужный буфер чтобы сообщение не лежало в слоте.
        End If
    End If
End Sub
(ну а внутри функции ReadMessage - ReadFile и т.д.)
3 / 3 / 0
Регистрация: 12.07.2010
Сообщений: 128
10.10.2010, 11:46
Я что-то не понял, как использование таймера может помочь в увеличении
скорости. Ведь проблема в том, что пакеты должны быть менее 400 байт.
У меня они фиксированной длины. Пробовал и ровно 400 байт - не получается, хотя в справочниках написано 'не более 400 байт'. А это значит, для достижения скорости 6 Mb/s нужно бомбить сервер со скоростью не менее 16000 пакетов в секунду, а события таймера приходят не чаще, чем 18 раз в секунду, даже если установлен интервал таймера 1 мс. Но даже если и 1000 раз в секунду-все равно получается предел ~400Kb/s, не говоря уже о том, что события таймера низкоприоритетны со всеми вытекающими обстоятельствами!
Думал выход в том, чтобы за раз читать несколько сообщений в цикле
for i = 1 To MessageCount, и вот тут-то сервер начал вести себя не так
как это по логике следовало из описаний вышеприведенных функций.
А мой код - это максимум, что удалось выжать из Mailslot.
PS: Этот код я написал на Си давно. А когда увидел вопрос
переложил на VB. Результат неопробован - нет сети.
0
Comanche
10.10.2010, 11:58
Согласен, неудачный вариант таймера - выдрал код из своей старой проги. Конечно, лучше пользоваться API-таймерами (шаг = 1 мс; функции SetTimer/KillTimer).
Думаю, попробовать стоит...
3 / 3 / 0
Регистрация: 12.07.2010
Сообщений: 128
10.10.2010, 13:23
Не хочу надоедать, но как я выше писал, с интервалом 1мс получаем предел ~400Kb/c, если читать по одному пакету. А если не по одному,
то даже программа на Си, со всей своей скоростью, с циклом без Sleep (пробовал и Sleep(50), Sleep(1)) пропускает пакеты. У меня этому факту только одно объяснение: когда после GetMailslotInfo по циклу
for i = 1 to MessageCount начинаем читать пакеты, наш сервер продолжает получать следующие пакеты, которые возможно из приемного буфера вытесняют предыдущие, еще не полностью выбранные пакеты, или что-то в этом роде, но при этом почему-то не выдает никаких ошибок.
Надежная работа у меня получилась только с использованием ожидания подтверждения получения сервером пакета по второму каналу перед отправкой следующего.
При этом производительность связки около 1 Mb/s, а сеть, теоретичесчи позволяет на проядок больше. Так каким способом должны пользоваться сервер и клиенты, чтобы было и бысторо и надежно?
И еще, почему проверка идет по NextMsgSize, ведь количество принятых (готовых для чтения пакетов возвращается в MessageCount, а если там ноль, значение NextMsgSize не актуально?
0
Comanche
10.10.2010, 13:38
Сдаюсь! )
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.10.2010, 13:38
Помогаю со студенческими работами здесь

Как определить, какой из подсетей принадлежит пакет IP-пакет?
То есть у Олиферов это всё подробно расписано. Если маршрутизация сделана на основе масок, то надо пробежаться по таблице маршрутизации и...

Как сделать широковещательный запрос в сети
Доброго времени форумчане, имеется сервер к которому подключено более 300 устройств, со своими известными заранее адресами, требуется...

Как отослать e-mail из VB???
Mne nuzno otsilat` fail iz VB. Ya videl primer s ispol`zovaniem Microsoft Outlook, no mne nuzno podrugomu, tk tak ne vsegda rabotaet. ...

Как отослать письмо пользователю.
Люди добрые, помогите, а то я уже с ума потихоньку начинаю сходить. Есть у меня в форме поле . Поле изменяемое, изменяется при...

Как отослать письмо на e-mail?
помогите кто может, как написать прогу на Visual C++6: мне необходимо отослать письмо со своего компа допустим на свой e-mail с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru