Аналог функции getsockname

VISA, TCP/IP, USB, CAN, GPIB и подобные протоколы
Ответить
zorg25406
beginner
beginner
Сообщения: 15
Зарегистрирован: 12 апр 2016, 19:52
Версия LabVIEW: 11, 14
Благодарил (а): 1 раз
Контактная информация:

Аналог функции getsockname

Сообщение zorg25406 »

Доброго времени суток. Стоит задача по: есть некий сервер с которым общение проходит по TCP. Первый шаг - клиент посылает запрос на подключение к серверу по заранее известному порту (например, 1234) и IP. Второй шаг - происходит соединение. На этих шагах сервер молчит и ничего в обратку не шлет. Далее мне необходимо узнать свой порт, который был выбран для текущего подключения. В с++, питоне и т.д. это делается элементарно функцией getsockname(). В LabVIEW я этого так и не нашел. Готовые темы форума тоже изучил, подобного никто не делал. После определения своего порта я должен буду его вставлять в каждую передаваемую посылку. Подскажите кто что сможет.
ujin1
adviser
adviser
Сообщения: 231
Зарегистрирован: 06 ноя 2020, 15:37
Версия LabVIEW: 19
Благодарил (а): 18 раз
Поблагодарили: 37 раз
Контактная информация:

Re: Аналог функции getsockname

Сообщение ujin1 »

zorg25406 писал(а): 20 янв 2021, 07:02 Доброго времени суток. Стоит задача по: есть некий сервер с которым общение проходит по TCP. Первый шаг - клиент посылает запрос на подключение к серверу по заранее известному порту (например, 1234) и IP. Второй шаг - происходит соединение. На этих шагах сервер молчит и ничего в обратку не шлет. Далее мне необходимо узнать свой порт, который был выбран для текущего подключения. В с++, питоне и т.д. это делается элементарно функцией getsockname(). В LabVIEW я этого так и не нашел. Готовые темы форума тоже изучил, подобного никто не делал. После определения своего порта я должен буду его вставлять в каждую передаваемую посылку. Подскажите кто что сможет.
При подключении к стороннему серверу эта информация скрыта. Есть выход connеtction ID. Следующие блоки TCP Read и TCP Write используют connection ID, полученный при установлении соединения.
TCP open connection.png
TCP open connection.png (7.99 КБ) 2780 просмотров
Свой порт выдается автоматически, но есть вход для задания. Возможно это то, что Вам нужно.
Вы можете установить более одного соединений к одному и тому же порту одного и того же устройства если его сервер позволяет. Я пробовал до 60 соединений
Изображение
zorg25406
beginner
beginner
Сообщения: 15
Зарегистрирован: 12 апр 2016, 19:52
Версия LabVIEW: 11, 14
Благодарил (а): 1 раз
Контактная информация:

Re: Аналог функции getsockname

Сообщение zorg25406 »

Спасибо, но это немного не то. Мне как раз таки нужно знать какой порт я получил автоматически, чтобы его затем записать в посылку для отправки. Возможно можно ID расшифровать?
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Аналог функции getsockname

Сообщение dadreamer »

Думаю, вот эти SubVI должны помочь: https://forums.ni.com/t5/LabVIEW/connec ... 99#M434498
You can however retrieve the underlaying platform handle from a VALID network refnum by using the function in vi.lib\Utility\tcp.llb\UDP Get Raw Net Object.vi and vi.lib\Utility\tcp.llb\TCP Get Raw Net Object.vi for the respective refnum type. This will return the socket handle that you can pass directly to Winsock functions on Windows, and Berkeley socket functions on other platforms.
Проверить и сделать пример сейчас нет возможности. Попробуйте сами настроить CLFN и извлечь инфу из хэндла.
zorg25406
beginner
beginner
Сообщения: 15
Зарегистрирован: 12 апр 2016, 19:52
Версия LabVIEW: 11, 14
Благодарил (а): 1 раз
Контактная информация:

Re: Аналог функции getsockname

Сообщение zorg25406 »

dadreamer писал(а): 20 янв 2021, 11:59 Думаю, вот эти SubVI должны помочь: https://forums.ni.com/t5/LabVIEW/connec ... 99#M434498
You can however retrieve the underlaying platform handle from a VALID network refnum by using the function in vi.lib\Utility\tcp.llb\UDP Get Raw Net Object.vi and vi.lib\Utility\tcp.llb\TCP Get Raw Net Object.vi for the respective refnum type. This will return the socket handle that you can pass directly to Winsock functions on Windows, and Berkeley socket functions on other platforms.
Проверить и сделать пример сейчас нет возможности. Попробуйте сами настроить CLFN и извлечь инфу из хэндла.
Воспользовался функцией TCP Get Raw, ничего на выходе не получил. Код программы к сожалению приложить возможности не имею. Пытался посмотреть начинку данной функции, чтобы для себя приспособить - стоит пароль. Код программы простой: 1. Слушатель (сервер) ожидает подключения. 2. Клиент вводит порт и IP, запускается программа и происходит подключение. 3. К выходу ID функции TCP подключаю TCP Get Raw ставлю индикатор на его выход и ничего нет, даже ошибки. Возможно что-то не так делаю. Пробовал и ответ сервера отправлять клиенту, все равно пусто. Может что-то не так делаю. Если есть возможность, прошу пример кода, хотя бы скрином. Повторюсь: после подключения порт клиента (например, 80 ил 2035 или любой другой, присвоенный автоматом) должен выводиться на индикатор. Сервер не умеет сообщать данную информацию.
zorg25406
beginner
beginner
Сообщения: 15
Зарегистрирован: 12 апр 2016, 19:52
Версия LabVIEW: 11, 14
Благодарил (а): 1 раз
Контактная информация:

Re: Аналог функции getsockname

Сообщение zorg25406 »

Ситуация изменилась. Функция TCP Get Raw начала выдавать произвольные числа на выходе. С помощью программки на питоне я определяю свой порт при каждом подключении к серверу. Получается примерно так: результат на питоне: 7031. Результат в LabVIEW: 15375. И каждый раз новый порт и новый Handle. Как с ним работать, пока не понял.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Аналог функции getsockname

Сообщение dadreamer »

zorg25406 писал(а): 20 янв 2021, 16:41Как с ним работать, пока не понял.
Ну, вы же сами уже озвучили решение - getsockname function (winsock.h). Пример определения порта также легко находится: Sockets - How to find out what port and address I'm assigned. Я сделал кластер и настроил CLFN, но не проверял. Попробуйте, по идее должно работать. Хотя, быть может, нужно будет отсеять нулевые хэндлы, чтобы ошибки не возникало.
Вложения
Example_VI_BD.png
zorg25406
beginner
beginner
Сообщения: 15
Зарегистрирован: 12 апр 2016, 19:52
Версия LabVIEW: 11, 14
Благодарил (а): 1 раз
Контактная информация:

Re: Аналог функции getsockname

Сообщение zorg25406 »

dadreamer писал(а): 20 янв 2021, 19:06
zorg25406 писал(а): 20 янв 2021, 16:41Как с ним работать, пока не понял.
Ну, вы же сами уже озвучили решение - getsockname function (winsock.h). Пример определения порта также легко находится: Sockets - How to find out what port and address I'm assigned. Я сделал кластер и настроил CLFN, но не проверял. Попробуйте, по идее должно работать. Хотя, быть может, нужно будет отсеять нулевые хэндлы, чтобы ошибки не возникало.
Как я понял, единственный вариант решения проблемы: требуется создание на С (С++) DLL, которую необходимо подгружать с помощью Call Library Function Node. Никогда не работал с этой функцией и поэтому возникло непонимание вашего кода... Посмотрел примеры работы с CLFN, все они достаточно простые (математические операции и т.п.). Ничего сложного нет: подгружается dll, задаются входные и выходные данные и все готово. В моем случае есть вопросы:
1. Для чего нужен именно кластер? Интуитивно понимаю зачем, но хотелось бы осознать данное действие.
2. Какие переменные нужно определять в CLFN и какой тип указывать? Кластер, как входная единица, тоже должен определяться (как я понял), но какой тип ему задать? Это ведь не массив и не строка.
3. Что я получу на выходе и в каком виде? Из вашего скриншота видно, что получаю я уже готовый порт. Так ли это?
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Аналог функции getsockname

Сообщение dadreamer »

zorg25406 писал(а): 20 янв 2021, 21:58требуется создание на С (С++) DLL, которую необходимо подгружать с помощью Call Library Function Node
Не надо. Используется Ws2_32.dll из WinAPI. Более того, уже всё готово, нужно только подать хэндл и получить порт.
zorg25406 писал(а): 20 янв 2021, 21:581. Для чего нужен именно кластер? Интуитивно понимаю зачем, но хотелось бы осознать данное действие.
В C/C++ структура (struct), в :labview: кластер. Названия разные, суть одна и та же.
zorg25406 писал(а): 20 янв 2021, 21:582. Какие переменные нужно определять в CLFN и какой тип указывать? Кластер, как входная единица, тоже должен определяться (как я понял), но какой тип ему задать? Это ведь не массив и не строка.
Уже задано. Adapt to Type -> Handles by Value. То есть, :labview: передаёт в DLL указатель на входные данные (неважно, какие). Настройка параметров выполняется строго по прототипу вызываемой функции. В данном случае прототип такой:

Код: Выделить всё

int getsockname(SOCKET s, sockaddr *name, int *namelen);
Видно, что второй параметр передаётся "по ссылке", т.е. должен быть указан адрес структуры в памяти.
zorg25406 писал(а): 20 янв 2021, 21:583. Что я получу на выходе и в каком виде? Из вашего скриншота видно, что получаю я уже готовый порт. Так ли это?
Должен получиться порт. Но проверьте. Может, порядок байт придётся переставить.

Если интересно разобраться с CLFN и вызовами библиотек, то можно начать отсюда.
zorg25406 писал(а): 20 янв 2021, 21:58Из вашего скриншота
Спустя какое-то время меня озарило :crazy: Using VI Snippets to Store and Share Reusable Code Sections
zorg25406
beginner
beginner
Сообщения: 15
Зарегистрирован: 12 апр 2016, 19:52
Версия LabVIEW: 11, 14
Благодарил (а): 1 раз
Контактная информация:

Re: Аналог функции getsockname

Сообщение zorg25406 »

Стало яснее, спасибо. Пытался повторить ваш код, но ничего не выходит. Прилагаю фрагменты.
Код 1.png
CLF_1.png
CLF_2.png
Результат.png
Результат.png (7.7 КБ) 2689 просмотров
Третью и четвертую вкладку настраивать я так понял не требуется. Return type стоит по умолчанию void, так и должно быть.
dadreamer писал(а): 20 янв 2021, 22:19 Видно, что второй параметр передаётся "по ссылке", т.е. должен быть указан адрес структуры в памяти.
Возможно я это не сделал, пока не понял как.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Аналог функции getsockname

Сообщение dadreamer »

zorg25406, не знаю, зачем вы пытаетесь воспроизвести этот код, может для общего развития... Но то, что я выше выложил, это не только скриншот, а ещё и сниппет. Сохраните картинку на жёсткий диск и перетащите на блок-диаграмму. Получите готовый код. :wink:
zorg25406
beginner
beginner
Сообщения: 15
Зарегистрирован: 12 апр 2016, 19:52
Версия LabVIEW: 11, 14
Благодарил (а): 1 раз
Контактная информация:

Re: Аналог функции getsockname

Сообщение zorg25406 »

dadreamer писал(а): 21 янв 2021, 08:02 zorg25406, не знаю, зачем вы пытаетесь воспроизвести этот код, может для общего развития... Но то, что я выше выложил, это не только скриншот, а ещё и сниппет. Сохраните картинку на жёсткий диск и перетащите на блок-диаграмму. Получите готовый код. :wink:
Если использовать готовый код, то не будет развития, не запомнится принцип работы. А так разобрался, вдобавок еще и узнал про шикарную вещь - сниппет! :super: Не знал про такую фишку в LabVIEW. А по делу - все заработало как часы, единственно, как вы и писали, нужно было старший и младший байты местами поменять. Так что спасибо большое :thank: !
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Коммуникация с приборами»