powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Еще раз про формат данных в rdb$get_context('SYSTEM', 'CLIENT_ADDRESS')
12 сообщений из 12, страница 1 из 1
Еще раз про формат данных в rdb$get_context('SYSTEM', 'CLIENT_ADDRESS')
    #40094716
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

Firebird-2.5.8
Хочу на основе rdb$get_context('SYSTEM', 'CLIENT_ADDRESS') сделать раздачу некоторой информации клиентам.
Проблемка в том что:
  • иногда вместо ip-адреса там имя компа
  • по слухам, с какой-то версии к ip-адресу добавляется порт клиента
А как отключить преобразование ip-адреса в имя?

В актуальной доке на 2.5
Firebird 2.5.9
10 ноября 2020 — v.0502-1
ничего ни про имя ни про порт не написано.

Код: plaintext
1.
2.
3.
CLIENT_ADDRESS 
Для TCPv 4 – IP адрес, 
для XNET – локальный ID процесса.
Для остальных случаев NULL.
...
Рейтинг: 0 / 0
Еще раз про формат данных в rdb$get_context('SYSTEM', 'CLIENT_ADDRESS')
    #40094794
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks> А как отключить преобразование ip-адреса в имя?

Запрети XNET-соединения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Еще раз про формат данных в rdb$get_context('SYSTEM', 'CLIENT_ADDRESS')
    #40094986
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
fraks> А как отключить преобразование ip-адреса в имя?
Запрети XNET-соединения.

Не нашел где и как их запретить, но стало понятно куда смотреть.

XNET у меня только в случае если программа запускается с той же тачки где и сервер, да и то только в некоторых случаях.
Логичным будет, в механизме работы с rdb$get_context('SYSTEM', 'CLIENT_ADDRESS') сначала заглянуть в rdb$get_context('SYSTEM', 'NETWORK_PROTOCOL')

Ну и добавил в свой лог коннектов поле с протоколом, что бы можно было ретроспективно смотреть подобные вещи.
...
Рейтинг: 0 / 0
Еще раз про формат данных в rdb$get_context('SYSTEM', 'CLIENT_ADDRESS')
    #40095050
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks> Не нашел где и как их запретить

От версии зависит. У тебя вроде 2.5, так что параметр -i
в командной строке спасёт отца сибирской демократии.

> XNET у меня в случае

Ну и зря.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Еще раз про формат данных в rdb$get_context('SYSTEM', 'CLIENT_ADDRESS')
    #40101018
Zl0bny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, чтобы не открывать новый топик, вопрос из схожей области:

Firebird 2.5.9
Кодировка БД - UTF8
Есть триггер DB_CONNECT , задача которого закидывать в отдельную табличку информацию вида:
Время события, IP с которого осуществлён коннект, имя юзера, процесс которым подключаемся.

До недавнего времени всё работало безотказно, но стали появляться клиенты писаные на C# с .NetFramework
и при размещении исполняемого файла в папке с кириллическими буквами RDB$GETCONTEXT('SYSTEM', 'CLIENT_PROCESS')
плюётся "Malformed string". Опытным путём выяснилось, что проекты на .NetCore такой болезнью не болеют.
Connection string правильный, кодировка подключения к БД указана как UTF8.

При этом ломается не сам вызов процедуры, а момент вставки результата в табличку.
В процессе отладки, триггер был заменён просто конструкцией вида
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare variable CLIENT_PROCESS RDB$FILE_NAME2;
declare variable CLIENT_PROCESS2 varchar(500) character set UTF8;

...

/* тут всё работает */
select MON$REMOTE_PROCESS from MON$ATTACHMENTS where MON$ATTACHMENT_ID = current_connection into :CLIENT_PROCESS;
/* а тут вылетает "Malformed string" */
CLIENT_PROCESS2 = cast(:CLIENT_PROCESS as varchar(255) character set UTF8);


Т.е. очевидно, что косяк в кодировке, но чем вылечить эту беду?
Старые прилаги писаные на Delphi успешно стартуют из любых папок и RDB$GETCONTEXT('SYSTEM', 'CLIENT_PROCESS') отрабатывает без ошибок.
Куда копать?
...
Рейтинг: 0 / 0
Еще раз про формат данных в rdb$get_context('SYSTEM', 'CLIENT_ADDRESS')
    #40101035
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zl0bnyТ.е. очевидно, что косяк в кодировке, но чем вылечить эту беду?

Очевидно копанием в .NET провайдере с целью его исправления, поскольку сервер
просто получает имя процесса от клиента и не контролирует его на входе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Еще раз про формат данных в rdb$get_context('SYSTEM', 'CLIENT_ADDRESS')
    #40101059
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zl0bny
Коллеги, чтобы не открывать новый топик, вопрос из схожей области:
Никогда не понимал эту отмазку - в чём проблема создать НОВУЮ тему и не ЗАСОРЯТЬ старую ?


Zl0bny
Т.е. очевидно, что косяк в кодировке, но чем вылечить эту беду?
Можно попробовать каст в NONE потом в WIN1251 потом уже в UTF8. Не проверял.
...
Рейтинг: 0 / 0
Еще раз про формат данных в rdb$get_context('SYSTEM', 'CLIENT_ADDRESS')
    #40101061
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Очевидно копанием в .NET провайдере с целью его исправления
Возможно оно уже там исправлено. Нужно трекер проверять, или в группе спросить.
...
Рейтинг: 0 / 0
Еще раз про формат данных в rdb$get_context('SYSTEM', 'CLIENT_ADDRESS')
    #40101171
Zl0bny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad
Zl0bny
Коллеги, чтобы не открывать новый топик, вопрос из схожей области:
Никогда не понимал эту отмазку - в чём проблема создать НОВУЮ тему и не ЗАСОРЯТЬ старую ?

Не знаком с правилами и традициями этого "дома" потому так.
В ряде сообществ встречал негативную реакцию на создание новых тем с аналогичными вопросами.

hvlad
Zl0bny
Т.е. очевидно, что косяк в кодировке, но чем вылечить эту беду?
Можно попробовать каст в NONE потом в WIN1251 потом уже в UTF8. Не проверял.

А вот тут спасибо от души . Конструкция вида:
Код: sql
1.
CLIENT_PROCESS = cast(cast(cast(rdb$get_context('SYSTEM', 'CLIENT_PROCESS') as varchar(255) character set NONE) as varchar(255) character set WIN1251) as varchar(255) character set UTF8);


работает!

И вот тут вопрос: как? Т.е. я могу логически понять для чего нужен каст в NONE, но из него напрямую в UTF8 вылетает всё тот же "Malformed string". Только через WIN1251, всё ожило. Где-нибудь описано такое волшебство или это знание добывается из исходников Firebird?
...
Рейтинг: 0 / 0
Еще раз про формат данных в rdb$get_context('SYSTEM', 'CLIENT_ADDRESS')
    #40101175
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
первый каст в NONE по идее лишний, т.к. GET_CONTEXT и так возвращает строку в чарсете NONE
второй каст подменяет чарсет строки на WIN1251 (ибо кириллический путь в винде это cp1251), не производя перекодировку
третий каст перекодирует корректную WIN1251-строку в UTF8

любые попытки обойти WIN1251 обречены, ибо сервер проверяет UTF8 строку на корректность и ругается если там на самом деле что-то другое (1251 в данном случае)
...
Рейтинг: 0 / 0
Еще раз про формат данных в rdb$get_context('SYSTEM', 'CLIENT_ADDRESS')
    #40101204
Zl0bny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dimitr
первый каст в NONE по идее лишний, т.к. GET_CONTEXT и так возвращает строку в чарсете NONE
второй каст подменяет чарсет строки на WIN1251 (ибо кириллический путь в винде это cp1251), не производя перекодировку
третий каст перекодирует корректную WIN1251-строку в UTF8

любые попытки обойти WIN1251 обречены, ибо сервер проверяет UTF8 строку на корректность и ругается если там на самом деле что-то другое (1251 в данном случае)


Таки да! Каст в NONE действительно лишний. Спасибо ещё раз. Сутки безуспешно бился над этой задачкой, думал уже отказаться от протоколирования коннектов из-за этого бага.
...
Рейтинг: 0 / 0
Еще раз про формат данных в rdb$get_context('SYSTEM', 'CLIENT_ADDRESS')
    #40101236
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zl0bny
В ряде сообществ встречал негативную реакцию на создание новых тем с аналогичными вопросами.
Ваш вопрос даже близко "не аналогичный".
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Еще раз про формат данных в rdb$get_context('SYSTEM', 'CLIENT_ADDRESS')
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]