TCP Listen и интервал портов
- Di3el
- beginner
- Сообщения: 45
- Зарегистрирован: 18 дек 2012, 17:28
- Версия LabVIEW: 11
- Откуда: Российская Федерация
- Контактная информация:
TCP Listen и интервал портов
Прошу помощи в сложившейся ситуации!
Необходимо реализовать прослушку не одного порта, а интервала. Клиент выбирает случайно один порт из 50, а вот с сервером пока беда.
Наиболее полезные ответы:
http://www.labviewportal.eu/viewtopic.p ... 533#p45960
http://www.labviewportal.eu/viewtopic.p ... 533#p46074
Необходимо реализовать прослушку не одного порта, а интервала. Клиент выбирает случайно один порт из 50, а вот с сервером пока беда.
Наиболее полезные ответы:
http://www.labviewportal.eu/viewtopic.p ... 533#p45960
http://www.labviewportal.eu/viewtopic.p ... 533#p46074
- Вложения
-
- Random port.vi
- Случайно выбирает порт из указанного интервала.
- (19.72 КБ) 140 скачиваний
Последний раз редактировалось Di3el 07 янв 2013, 18:26, всего редактировалось 2 раза.
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: TCP Listen и интервал портов.
А не пробовали создать реентерабельную SubVI - Слушатель. И запустить несколько.Di3el писал(а):Прошу помощи в сложившейся ситуации!
Необходимо реализовать прослушку не одного порта, а интервала. Клиент выбирает случайно один порт из 50, а вот с сервером пока беда.
По идее должно работать нормально, только не знаю сколько экземпляров можно запустить одновременно и как будет работать при большом их количестве.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
- Di3el
- beginner
- Сообщения: 45
- Зарегистрирован: 18 дек 2012, 17:28
- Версия LabVIEW: 11
- Откуда: Российская Федерация
- Контактная информация:
Re: TCP Listen и интервал портов.
К сожалению не совсем, а точнее совсем не понятно что вы предлагаете делать. Почитал что такое SubVI, как его создать, а каковы мои дальнейшие действия? Спасибо!
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: TCP Listen и интервал портов.
http://www.labview.webhost.ru/?%CF%F0%E ... 5%EC_SubVIDi3el писал(а):К сожалению не совсем, а точнее совсем не понятно что вы предлагаете делать. Почитал что такое SubVI, как его создать, а каковы мои дальнейшие действия? Спасибо!
Здесь как раз рассматривается Ваш вариант с TCP: http://labviewwiki.org/Reentrant_VI
http://www.labview.ru/forum/viewtopic.php?f=1&t=11433
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
- Di3el
- beginner
- Сообщения: 45
- Зарегистрирован: 18 дек 2012, 17:28
- Версия LabVIEW: 11
- Откуда: Российская Федерация
- Контактная информация:
Re: TCP Listen и интервал портов.
Создал я все как надо, сделал слушателя в виде подпрограммы SubVI и поставил галочку Reentrant execution. Но то что хотел не получилось, столкнулся с тем. что у меня все же эти подпрограммы не прослушивают одновременно каждый порт, а в какой то последовательности по одному. В приложение картинка при отладки. Не чего пока не могу понять не получается параллельная работа каждой SubVI.IvanLis писал(а):А не пробовали создать реентерабельную SubVI - Слушатель. И запустить несколько. По идее должно работать нормально, только не знаю сколько экземпляров можно запустить одновременно и как будет работать при большом их количестве.
- Вложения
-
- Безымянный.png (9.68 КБ) 8136 просмотров
-
Andrew Lunev
- VIP
- Сообщения: 957
- Зарегистрирован: 11 дек 2010, 12:31
- Награды: 2
- Версия LabVIEW: 2014-2021
- Откуда: Москва
- Благодарил (а): 4 раза
- Поблагодарили: 10 раз
Re: TCP Listen и интервал портов.
Галочка в Reentrant execution всего лишь разрешает параллельную работу, но не гарантирует ее. Чтобы процессы реально были параллельными необходимо чтобы и все функции, входящие в SubVI так же поддерживали Reentrant execution. Скорее всего какая-то функция внутри обращается к не разделяемым ресурсам компьютера, поэтому LabView выполняет ваши SubVI последовательно.
- Di3el
- beginner
- Сообщения: 45
- Зарегистрирован: 18 дек 2012, 17:28
- Версия LabVIEW: 11
- Откуда: Российская Федерация
- Контактная информация:
Re: TCP Listen и интервал портов.
Весьма плачевная весть может удастся еще что нибудь найтиAndrew Lunev писал(а):Галочка в Reentrant execution всего лишь разрешает параллельную работу, но не гарантирует ее. Чтобы процессы реально были параллельными необходимо чтобы и все функции, входящие в SubVI так же поддерживали Reentrant execution. Скорее всего какая-то функция внутри обращается к не разделяемым ресурсам компьютера, поэтому LabView выполняет ваши SubVI последовательно.
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: TCP Listen и интервал портов.
а не пробовали запускать SubVI через Open VI ReferenceDi3el писал(а):Весьма плачевная весть может удастся еще что нибудь найти
посмотрите: http://www.labviewportal.org/viewtopic. ... 443#p29958
Выложите свои потуги, что бы не изобретать все заново.
А там посмотрим, в чем проблемы.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: TCP Listen и интервал портов.
Самое интересное, что у меня все получилось не знаю, в чем у Вас проблемы?IvanLis писал(а):Выложите свои потуги, что бы не изобретать все заново.
А там посмотрим, в чем проблемы.
и к тому-же....
у Вас ТаймАут = -1, это значит он будет ждать пока не получит данные
а как же параллельные процессы? выполнятся и остановятся (в случае если один из них ничего не получит)...
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- VIP
- Сообщения: 1341
- Зарегистрирован: 03 фев 2010, 00:42
- Награды: 6
- Версия LabVIEW: 6.1 - 2024
- Откуда: Германия
- Благодарил (а): 1 раз
- Поблагодарили: 44 раза
- Контактная информация:
Re: TCP Listen и интервал портов.
Коллега Di3el, мне вот почему-то кажется, что вы так хотите сделать не потому что так надо по техзаданию, а оттого, что вы не знаете, что на одном порту можно открыть несколько соединений. При такой постановке задачи всё равно ведь придётся предусмотреть ситуацию, когда два клиента открывают соединения на один и тот же порт - ведь порт выбирается случайно, а клиенты друг о друге знать не обязаны. Так почему бы не открыть просто 50 соединений на один и тот-же порт? Это во-первых.Di3el писал(а):Прошу помощи в сложившейся ситуации!
Необходимо реализовать прослушку не одного порта, а интервала. Клиент выбирает случайно один порт из 50, а вот с сервером пока беда.
Кроме того, если уж слушать диапазон портов, то без динамического запуска VI задачку решить элегантно не получится - ведь придётся положить на блок-диаграмму 50 слушателей, что мягко говоря некрасиво - их надо запускать в цикле, а иначе решение будет негибким - если количество портов будет меняться, вам придётся ручками изменять код. Это во-вторых.
Но тем не менее. В LabVIEW 2011 появилась замечательная примочка - асинхронный вызов VI, с помощью этой штуки задачка решается довольно просто. Давайте решим задачу в общем случае - множественные клиенты соединяются с пулом портов (при этом два и более клиента могут подключиться к одному порту). В принципе всего-то надо чуть допилить примеры, прилагаемые к LabVIEW.
Приготовим для упражнения простенький сервер, который раз в секунду будет слать клиенту текущее время:
Этот пример я стащил у NI. Теоретически можно отдавать время по запросу, но усложнить-то вы всегда успеете. Заметьте, что этот VI - реентрантный, он будет запускаться на каждое входящее соединение. Назовём его DateServer - Handler.vi. После запуска цикл будет крутиться до тех пор, пока активен клиент. Как только клиент отвалится - цикл остановится.
Теперь надо открыть ссылку для запуска этого VI. Это делается вот так:
Тут две хитрости. Первая - флаги для открытия ссылки 0x40 и 0x80. Что они означают - читайте в хелпе - Open VI Reference Function. Вкратце - один флаг готовит реентрантный VI для асинхронного запуска, а второй - что мы будем запускать его в режиме "запустить и забыть". Вторая хитрость - установка размера пула асинхронного вызова. Почитать об этом можно вот тут - Populate Asynchronous Call Pool Method. NI рекомендует установить значение таким, сколько копий ожидается запустить (в данном случае это максимальное число клиентов, которое могут подсоединиться к серверу). В принципе если число клиентов превысит размер пула, то ничего страшного не должно произойти, просто время отклика может возрасти.
Теперь самое интересное. Сервер (читай DateServer - Handler.vi) мы будем динамически запускать для каждого клиента. Соответственно нам понадобится слушатель порта. Делается это вот так:
Тут в цикле While слушатель ждёт входящее соединение (таймаут по умолчанию -1 - ждать вечно). Как только клиент открывает порт, динамически запускается DateServer - Handler.vi. Несмотря на то, что внутри самого DateServer - Handler.vi есть цикл, мы не остановимся в точке запуска Start Asynchronous Call Node - итерация while завершится, DateServer - Handler.vi останется в запущенном состоянии, а слушатель будет продолжать слушать порт (тот же самый!). Если теперь второй клиент подсоединится на этот же самый порт, то и для него запустится вторая копия DateServer - Handler.vi.
Но это ещё не всё - ведь слушателя-то тоже надо запускать динамически (их понадобится 50 штук по условиям задачки). Делаем точно также как и выше - создаём ссылку:
Ну и теперь можно собрать всё вместе:
В этом примере открывается 50 портов - для них запускается полсотни слушателей, а клиенты могут открывать соединения на любой порт из диапазона 6341-6390, при этом два клиента могут открыть один и тот же порт (я предположил, что общее число клиентов будет 100). При нажатии кнопки stop закрываются все 50 tcp ссылок слушателей и это приводит к их останову. По идее, конечно имеет смысл проверять, что слушатель не возвращает ошибку и т.п., но для учебных целей такого примера более чем достаточно.
Клиент тривиален:
Вот вроде и всё. Открываете и запускаете сначала сервер, а потом клиентов. Я там три клиента приложил - первый и второй для порта 6341, а третий для 6342. Запустите их одновременно - все они будут получать время с сервера, если я не ошибся нигде.
Проект я сохранил для 2011, но у меня 2012. В прошлой версии были какие-то траблы с асинхронным вызовом - надеюсь вы на них не наткнётесь (проверить не могу, у меня 2011 не установлена).
Меня правда, немного напрягает вот это ваше замечание
потому что между "Почитал что такое SubVI, как его создать" и тем, что я изложил выше, скажем так - довольно приличное расстояние (тем паче что отладка динамически вызываемых реентрантных VI - то ещё удовольствие), но если вы детально разберётесь как оно работает, то реально продвинетесь в LabVIEW.Di3el писал(а):Почитал что такое SubVI, как его создать, а каковы мои дальнейшие действия?
Успехов!
- Вложения
-
- TCPMultiple.zip
- (58.63 КБ) 164 скачивания
- Di3el
- beginner
- Сообщения: 45
- Зарегистрирован: 18 дек 2012, 17:28
- Версия LabVIEW: 11
- Откуда: Российская Федерация
- Контактная информация:
Re: TCP Listen и интервал портов.
Всем спасибо за ответы! пища для ума получена, буду ее переваривать!=)
- Di3el
- beginner
- Сообщения: 45
- Зарегистрирован: 18 дек 2012, 17:28
- Версия LabVIEW: 11
- Откуда: Российская Федерация
- Контактная информация:
Re: TCP Listen и интервал портов
Вот такой вопрос возник! При реализации программы по примеру указанному выше появились некоторые вопросы. Возможно при такой реализации сделать очередь клиентов? Так как сервер подключен к прибору по протоколу RS232, и если большое количество запросов придет о получении данных, то каждая будет пытаться подключится и считать данные с прибора но у нее не получается и она присылает клиенту не правильные данные либо вообще ничего не присылает. Что можете посоветовать? Спасибо!
- Di3el
- beginner
- Сообщения: 45
- Зарегистрирован: 18 дек 2012, 17:28
- Версия LabVIEW: 11
- Откуда: Российская Федерация
- Контактная информация:
Re: TCP Listen и интервал портов
Ммм... по примеру посмотрел весьма просто, но так как у меня создается динамически соединение возможно ли реализовать его?
И кстати этот алгоритм не эффективен для меня, так как из десяти клиентов слать запросы будут только трое на получение информации, а время будет разграничено на все десять. Или я не прав?
И кстати этот алгоритм не эффективен для меня, так как из десяти клиентов слать запросы будут только трое на получение информации, а время будет разграничено на все десять. Или я не прав?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 38 Ответы
- 13314 Просмотры
-
Последнее сообщение AndreyDmitriev
-
- 5 Ответы
- 253 Просмотры
-
Последнее сообщение IvanLis