Аналог функции getsockname
-
- beginner
- Сообщения: 15
- Зарегистрирован: 12 апр 2016, 19:52
- Версия LabVIEW: 11, 14
- Благодарил (а): 1 раз
- Контактная информация:
Аналог функции getsockname
Доброго времени суток. Стоит задача по: есть некий сервер с которым общение проходит по TCP. Первый шаг - клиент посылает запрос на подключение к серверу по заранее известному порту (например, 1234) и IP. Второй шаг - происходит соединение. На этих шагах сервер молчит и ничего в обратку не шлет. Далее мне необходимо узнать свой порт, который был выбран для текущего подключения. В с++, питоне и т.д. это делается элементарно функцией getsockname(). В LabVIEW я этого так и не нашел. Готовые темы форума тоже изучил, подобного никто не делал. После определения своего порта я должен буду его вставлять в каждую передаваемую посылку. Подскажите кто что сможет.
-
- adviser
- Сообщения: 231
- Зарегистрирован: 06 ноя 2020, 15:37
- Версия LabVIEW: 19
- Благодарил (а): 18 раз
- Поблагодарили: 37 раз
- Контактная информация:
Re: Аналог функции getsockname
При подключении к стороннему серверу эта информация скрыта. Есть выход connеtction ID. Следующие блоки TCP Read и TCP Write используют connection ID, полученный при установлении соединения. Свой порт выдается автоматически, но есть вход для задания. Возможно это то, что Вам нужно.zorg25406 писал(а): ↑20 янв 2021, 07:02 Доброго времени суток. Стоит задача по: есть некий сервер с которым общение проходит по TCP. Первый шаг - клиент посылает запрос на подключение к серверу по заранее известному порту (например, 1234) и IP. Второй шаг - происходит соединение. На этих шагах сервер молчит и ничего в обратку не шлет. Далее мне необходимо узнать свой порт, который был выбран для текущего подключения. В с++, питоне и т.д. это делается элементарно функцией getsockname(). В LabVIEW я этого так и не нашел. Готовые темы форума тоже изучил, подобного никто не делал. После определения своего порта я должен буду его вставлять в каждую передаваемую посылку. Подскажите кто что сможет.
Вы можете установить более одного соединений к одному и тому же порту одного и того же устройства если его сервер позволяет. Я пробовал до 60 соединений
-
- beginner
- Сообщения: 15
- Зарегистрирован: 12 апр 2016, 19:52
- Версия LabVIEW: 11, 14
- Благодарил (а): 1 раз
- Контактная информация:
Re: Аналог функции getsockname
Спасибо, но это немного не то. Мне как раз таки нужно знать какой порт я получил автоматически, чтобы его затем записать в посылку для отправки. Возможно можно ID расшифровать?
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Аналог функции getsockname
Думаю, вот эти SubVI должны помочь: https://forums.ni.com/t5/LabVIEW/connec ... 99#M434498
Проверить и сделать пример сейчас нет возможности. Попробуйте сами настроить CLFN и извлечь инфу из хэндла.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.
-
- beginner
- Сообщения: 15
- Зарегистрирован: 12 апр 2016, 19:52
- Версия LabVIEW: 11, 14
- Благодарил (а): 1 раз
- Контактная информация:
Re: Аналог функции getsockname
Воспользовался функцией TCP Get Raw, ничего на выходе не получил. Код программы к сожалению приложить возможности не имею. Пытался посмотреть начинку данной функции, чтобы для себя приспособить - стоит пароль. Код программы простой: 1. Слушатель (сервер) ожидает подключения. 2. Клиент вводит порт и IP, запускается программа и происходит подключение. 3. К выходу ID функции TCP подключаю TCP Get Raw ставлю индикатор на его выход и ничего нет, даже ошибки. Возможно что-то не так делаю. Пробовал и ответ сервера отправлять клиенту, все равно пусто. Может что-то не так делаю. Если есть возможность, прошу пример кода, хотя бы скрином. Повторюсь: после подключения порт клиента (например, 80 ил 2035 или любой другой, присвоенный автоматом) должен выводиться на индикатор. Сервер не умеет сообщать данную информацию.dadreamer писал(а): ↑20 янв 2021, 11:59 Думаю, вот эти SubVI должны помочь: https://forums.ni.com/t5/LabVIEW/connec ... 99#M434498Проверить и сделать пример сейчас нет возможности. Попробуйте сами настроить CLFN и извлечь инфу из хэндла.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.
-
- beginner
- Сообщения: 15
- Зарегистрирован: 12 апр 2016, 19:52
- Версия LabVIEW: 11, 14
- Благодарил (а): 1 раз
- Контактная информация:
Re: Аналог функции getsockname
Ситуация изменилась. Функция TCP Get Raw начала выдавать произвольные числа на выходе. С помощью программки на питоне я определяю свой порт при каждом подключении к серверу. Получается примерно так: результат на питоне: 7031. Результат в LabVIEW: 15375. И каждый раз новый порт и новый Handle. Как с ним работать, пока не понял.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Аналог функции getsockname
Ну, вы же сами уже озвучили решение - getsockname function (winsock.h). Пример определения порта также легко находится: Sockets - How to find out what port and address I'm assigned. Я сделал кластер и настроил CLFN, но не проверял. Попробуйте, по идее должно работать. Хотя, быть может, нужно будет отсеять нулевые хэндлы, чтобы ошибки не возникало.
-
- beginner
- Сообщения: 15
- Зарегистрирован: 12 апр 2016, 19:52
- Версия LabVIEW: 11, 14
- Благодарил (а): 1 раз
- Контактная информация:
Re: Аналог функции getsockname
Как я понял, единственный вариант решения проблемы: требуется создание на С (С++) DLL, которую необходимо подгружать с помощью Call Library Function Node. Никогда не работал с этой функцией и поэтому возникло непонимание вашего кода... Посмотрел примеры работы с CLFN, все они достаточно простые (математические операции и т.п.). Ничего сложного нет: подгружается dll, задаются входные и выходные данные и все готово. В моем случае есть вопросы:dadreamer писал(а): ↑20 янв 2021, 19:06Ну, вы же сами уже озвучили решение - getsockname function (winsock.h). Пример определения порта также легко находится: Sockets - How to find out what port and address I'm assigned. Я сделал кластер и настроил CLFN, но не проверял. Попробуйте, по идее должно работать. Хотя, быть может, нужно будет отсеять нулевые хэндлы, чтобы ошибки не возникало.
1. Для чего нужен именно кластер? Интуитивно понимаю зачем, но хотелось бы осознать данное действие.
2. Какие переменные нужно определять в CLFN и какой тип указывать? Кластер, как входная единица, тоже должен определяться (как я понял), но какой тип ему задать? Это ведь не массив и не строка.
3. Что я получу на выходе и в каком виде? Из вашего скриншота видно, что получаю я уже готовый порт. Так ли это?
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Аналог функции getsockname
Не надо. Используется Ws2_32.dll из WinAPI. Более того, уже всё готово, нужно только подать хэндл и получить порт.
В C/C++ структура (struct), в кластер. Названия разные, суть одна и та же.
Уже задано. Adapt to Type -> Handles by Value. То есть, передаёт в DLL указатель на входные данные (неважно, какие). Настройка параметров выполняется строго по прототипу вызываемой функции. В данном случае прототип такой:
Код: Выделить всё
int getsockname(SOCKET s, sockaddr *name, int *namelen);
Должен получиться порт. Но проверьте. Может, порядок байт придётся переставить.
Если интересно разобраться с CLFN и вызовами библиотек, то можно начать отсюда.
Спустя какое-то время меня озарило Using VI Snippets to Store and Share Reusable Code Sections
-
- beginner
- Сообщения: 15
- Зарегистрирован: 12 апр 2016, 19:52
- Версия LabVIEW: 11, 14
- Благодарил (а): 1 раз
- Контактная информация:
Re: Аналог функции getsockname
Стало яснее, спасибо. Пытался повторить ваш код, но ничего не выходит. Прилагаю фрагменты.
Третью и четвертую вкладку настраивать я так понял не требуется. Return type стоит по умолчанию void, так и должно быть.
Возможно я это не сделал, пока не понял как.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Аналог функции getsockname
zorg25406, не знаю, зачем вы пытаетесь воспроизвести этот код, может для общего развития... Но то, что я выше выложил, это не только скриншот, а ещё и сниппет. Сохраните картинку на жёсткий диск и перетащите на блок-диаграмму. Получите готовый код.
-
- beginner
- Сообщения: 15
- Зарегистрирован: 12 апр 2016, 19:52
- Версия LabVIEW: 11, 14
- Благодарил (а): 1 раз
- Контактная информация:
Re: Аналог функции getsockname
Если использовать готовый код, то не будет развития, не запомнится принцип работы. А так разобрался, вдобавок еще и узнал про шикарную вещь - сниппет! Не знал про такую фишку в LabVIEW. А по делу - все заработало как часы, единственно, как вы и писали, нужно было старший и младший байты местами поменять. Так что спасибо большое !
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 2 Ответы
- 306 Просмотры
-
Последнее сообщение maxim_MA
-
- 12 Ответы
- 909 Просмотры
-
Последнее сообщение JohnChaban