subbota пишет:
цитата: |
В HBNETIO Documentation от Przemyslaw Czerpak <druzus / at / priv.onet.pl> дано такое определение NETIO_MTSERVER( [<nPort>], [<cIfAddr>], [<cRootDir>], [<lRPC> | <sFuncSym> | <hValue>], [<cPasswd>], [<nCompressionLevel>], [<nStrategy>] ) -> <pListenSocket> Пробовал <lRPC> - то есть .t. или .f. - полное разрешение или запрет RPC-функций выполняется без проблем. А, что надо вставлять вместо <sFuncSym>, чтобы ограничить список этих функций не понял. |
|
Немного разобрался. Поясняю как понял сам.
RPC - это функции/процедуры, которые может вызывать клиент для их исполнения на сервере.
Если в 4-м параметре будет .t. - для клиента будут доступны все функции, видимые серверу.
Если в 4-м параметре будет .f. - клиенту будет запрещен доступ ко всем RPC функциям.
Если в 4-м параметре будет указатель на некоторую функцию, видимую на сервере,
то, при вызове клиентом любой RPC-функции, вместо нее сервер всегда выполнит
функцию, указатель которой был передан в 4-м параметре NETIO_MTSERVER()
и при этом передаст ей:
- в первом параметре указатель на RPC функцию, которую хочет вызвать клиент
- в следующих параметрах - значения для параметров вызываемой RPC функции.
Как я сделал
Добавил в prg-шник в модуле сервера ( того где вызов NETIO_MTSERVER() ) свою функцию примерно так:
function my_Func_Eval_RPC( s_RPC_func, xPar1, xPar2 ... )
...
local cName_RPC_func := hb_ValToStr( s_RPC_func ) // Так получу <@имя_RPC_функции()>, запрашиваемой клиентом
...
В xPar1, xPar2, ... - будут параметры для запрошенной RPC-функции
Текстовые выражения для параметров можно найти так:
private cxPar1 := hb_ValToStr( xPar1 )
private cxPar2 := hb_ValToStr( xPar2 )
...
Проанализировав: cName_RPC_func, cxPar1 и cxPar2,
можно решить, что сделать с этим запросом и что вернуть клиенту.
Например, так можно вернуть то, что он просит:
return s_RPC_func:exec( xPar1, xPar2 )
Или передать этот запрос куда-то еще, например, внешнему обработчику
и вернуть ему то, что вернет этот обработчик.
Запись вызова mt-сервера в модуле сервера для моего примера станет какой-то такой
pListenSocket := NETIO_MTSERVER( [<nPort>], [<cIfAddr>], [<cRootDir>], @my_Func_Eval_RPC(), [<cPasswd>], [<nCompressionLevel>], [<nStrategy>] )
Если клиент просит сервера выполнить hb_fsize( "myfile.dbf" ),
то вызов RPC - функции у клиента может быть таким:
NETIO_FUNCEXEC( "hb_fsize", "myfile.dbf" )
Тут только нужно не забыть, что полный путь к файлу на стороне сервера будет
cRootDir + "myfile.dbf"
Остальное в Readme.txt к Netio от Przemyslaw Czerpak <druzus / at / priv.onet.pl>
Я это описание и пример батовских файлов для консольной компиляции нашел в
Harbour MiniGUI Extended Edition 22.12 (Release)
MiniGUI\SAMPLES\Advanced\NETIO_1\
А идеалогия взаимодействия клиента и сервера Netio лучше понимается через
MiniGUI\SAMPLES\Advanced\NETIO_3\
Там же батники для графической компиляции.
Спасибо Dima за уделенное внимание !