Russian Qt Forum

Qt => Работа с сетью => Тема начата: DoZENT от Март 07, 2009, 19:42



Название: Переслать код от клиента серверу
Отправлено: DoZENT от Март 07, 2009, 19:42
Привет всем! Передо мной встала несколько необычная проблема: мне необходимо переслать произвольный код (функцию с заранее неизвестным количеством аргументов) от клиента серверу и выполнить его на сервере. Куда копать и вообще возможно ли это? Заранее спасибо.


Название: Re: Переслать код от клиента серверу
Отправлено: BRE от Март 07, 2009, 19:49
мне необходимо переслать произвольный код (функцию с заранее неизвестным количеством аргументов)
Что здесь имеется ввиду?


Название: Re: Переслать код от клиента серверу
Отправлено: DoZENT от Март 07, 2009, 20:09
мне необходимо переслать произвольный код (функцию с заранее неизвестным количеством аргументов)
Что здесь имеется ввиду?
Допустим, на машине-клиенте есть dll. Задача - выполнить одну из функций этой dll на машине-сервере. Можно ли как-то это сделать, не копирую эту dll на сервер?


Название: Re: Переслать код от клиента серверу
Отправлено: BRE от Март 07, 2009, 20:15
Допустим, на машине-клиенте есть dll. Задача - выполнить одну из функций этой dll на машине-сервере. Можно ли как-то это сделать, не копирую эту dll на сервер?
Бинарный код?
В принципе это конечно возможно - смотри эксплоиды.  ;)
Только нужно понимать, что на свете есть много процессоров разных архитектур, которые работают под управлением огромного числа операционных систем и т.д. и т.п.
Ты лучше задачу свою расскажи.
Что за клиент, что за сервер.


Название: Re: Переслать код от клиента серверу
Отправлено: DoZENT от Март 08, 2009, 19:20
Допустим, на машине-клиенте есть dll. Задача - выполнить одну из функций этой dll на машине-сервере. Можно ли как-то это сделать, не копирую эту dll на сервер?
Бинарный код?
В принципе это конечно возможно - смотри эксплоиды.  ;)
Только нужно понимать, что на свете есть много процессоров разных архитектур, которые работают под управлением огромного числа операционных систем и т.д. и т.п.
Ты лучше задачу свою расскажи.
Что за клиент, что за сервер.
задача - именно выполнение произвольного кода на чужой машине (понимаю, как это звучит, но не вирус я пишу, не вирус))) ) меня вот мысль посетила:

если оформить функцию как новый тип:
Код:
typedef void(*MyFunc)(int a);
писать в сокет переменную этого типа, то на сервер передастся сама функция или только ее адрес?


Название: Re: Переслать код от клиента серверу
Отправлено: BRE от Март 08, 2009, 19:29
задача - именно выполнение произвольного кода на чужой машине (понимаю, как это звучит, но не вирус я пишу, не вирус))) )
Так вот по этой причине java и появилась....

меня вот мысль посетила:

если оформить функцию как новый тип:
Код:
typedef void(*MyFunc)(int a);
писать в сокет переменную этого типа, то на сервер передастся сама функция или только ее адрес?
Ты можешь и кусок памяти с кодом функции передать, это не проблема.
Но для ее нормального выполнения на стороне сервера ей необходимо подготовить окружение (с учетом процессора для которого этот код компилировался, адреса ее работы и ..... ).


Название: Re: Переслать код от клиента серверу
Отправлено: DoZENT от Март 08, 2009, 19:46
Так вот по этой причине java и появилась....
java для меня не подходит - скорость выполнения критична
Ты можешь и кусок памяти с кодом функции передать, это не проблема.
Но для ее нормального выполнения на стороне сервера ей необходимо подготовить окружение (с учетом процессора для которого этот код компилировался, адреса ее работы и ..... ).
есть QT функция (в DLL, написанной на QT) на стороне клиента. Есть QT сервер. Не вижу проблемы несовместимости. Поясните подробней, пожалуйста.


Название: Re: Переслать код от клиента серверу
Отправлено: BRE от Март 08, 2009, 19:54
есть QT функция (в DLL, написанной на QT) на стороне клиента. Есть QT сервер. Не вижу проблемы несовместимости. Поясните подробней, пожалуйста.
У тебя процессор 32bit на сервере 64bit, или вообще motorola какая нибудь, для которой твой код просто набор байт.


Название: Re: Переслать код от клиента серверу
Отправлено: DoZENT от Март 08, 2009, 20:43
есть QT функция (в DLL, написанной на QT) на стороне клиента. Есть QT сервер. Не вижу проблемы несовместимости. Поясните подробней, пожалуйста.
У тебя процессор 32bit на сервере 64bit, или вообще motorola какая нибудь, для которой твой код просто набор байт.
OK. если отбросить проблему совместимости, то как все-таки реализовать задуманное?


Название: Re: Переслать код от клиента серверу
Отправлено: BRE от Март 08, 2009, 20:51
есть QT функция (в DLL, написанной на QT) на стороне клиента. Есть QT сервер. Не вижу проблемы несовместимости. Поясните подробней, пожалуйста.
У тебя процессор 32bit на сервере 64bit, или вообще motorola какая нибудь, для которой твой код просто набор байт.
OK. если отбросить проблему совместимости, то как все-таки реализовать задуманное?
Ты знаешь, ты с клиент/сервером пока не затевайся, попробуй сначала на одной машине выполнить функцию в контексте другого процесса. И google тебе в помощь, ибо сейчас даже затрудняюсь порекомендовать что почитать для начала.  ;)
А вообще, позиционно-независимый код (PIC), процессы, эксплоиды... ну а дальше уже само пойдет.


Название: Re: Переслать код от клиента серверу
Отправлено: DoZENT от Март 08, 2009, 21:53
есть QT функция (в DLL, написанной на QT) на стороне клиента. Есть QT сервер. Не вижу проблемы несовместимости. Поясните подробней, пожалуйста.
У тебя процессор 32bit на сервере 64bit, или вообще motorola какая нибудь, для которой твой код просто набор байт.
OK. если отбросить проблему совместимости, то как все-таки реализовать задуманное?
Ты знаешь, ты с клиент/сервером пока не затевайся, попробуй сначала на одной машине выполнить функцию в контексте другого процесса. И google тебе в помощь, ибо сейчас даже затрудняюсь порекомендовать что почитать для начала.  ;)
А вообще, позиционно-независимый код (PIC), процессы, эксплоиды... ну а дальше уже само пойдет.
Спасибо, я имею об этом понятие, год назад писал программу, одна из функций которой заключалась в перехвате Win32 функций. wasm.ru перечитал весь =) я думаю, вы не поняли суть моего вопроса. Я не собираюсь встраивать функцию в контекст другого процесса/скрыто исполнять программный код или что-то подобное. Вот как вы из dll вызываете функцию? Вы же не заморачиваетесь, под какую архитектуру процессора эта dll. Вы просто вызываете ее. Суть моего вопроса: можно ли функцию передать на сервер как некоторую переменную и там исполнить ее?


Название: Re: Переслать код от клиента серверу
Отправлено: BRE от Март 08, 2009, 22:21
Вот как вы из dll вызываете функцию? Вы же не заморачиваетесь, под какую архитектуру процессора эта dll. Вы просто вызываете ее. Суть моего вопроса: можно ли функцию передать на сервер как некоторую переменную и там исполнить ее?
Конечно вы не заморачиваетесь, за вас заморачивается операционная система. Она загружает dll в память процесса, настраивает адреса ее функций, что бы программа могла их вызывать и т.д.  ;)

Напиши необходимую функцию, дизассемблируй ее и посмотри какие функции она вызывает, по каким адресам и скажи как ты сможешь на сервере обеспечишь, что-бы по этим адресам находились необходимые функции?
Qt активно сохраняет свои состояния в статических структурах, как ты будешь настраивать их на стороне сервера?


Название: Re: Переслать код от клиента серверу
Отправлено: drsm от Март 09, 2009, 00:14
Привет всем! Передо мной встала несколько необычная проблема: мне необходимо переслать произвольный код (функцию с заранее неизвестным количеством аргументов) от клиента серверу и выполнить его на сервере. Куда копать и вообще возможно ли это? Заранее спасибо.
копай в сторону виртуальных машин и байткода.
это имхо единственный реальный вариант сделать то, что ты хочешь.

а "из длл" передать функцию по сети, это не получится. :)


Название: Re: Переслать код от клиента серверу
Отправлено: fuCtor от Март 09, 2009, 09:48
А если посмотреть в сторону RPC, или тех же скриптов, которые поддерживает Qt, Может и это подойдет для решения задачи.


Название: Re: Переслать код от клиента серверу
Отправлено: DoZENT от Март 09, 2009, 12:08
понятно, спасибо всем! буду копировать dll на сервер.


Название: Re: Переслать код от клиента серверу
Отправлено: DoZENT от Март 09, 2009, 14:38
встала новая проблема: а как аргументы функции передать на сервер? функция-то произвольная, всегда разное количество аргументов, разные их типы...


Название: Re: Переслать код от клиента серверу
Отправлено: Mixolap от Март 09, 2009, 23:07
То есть тебе надо определиться с протоколом.
Посмотри в сторону xml-rpc (http://ru.wikipedia.org/wiki/XML-RPC)


Название: Re: Переслать код от клиента серверу
Отправлено: nanit от Март 09, 2009, 23:16
А допустимо ли использовать функции вроде
 
  int someFunc(const int argc, const QVariant *argv[]);

и передавать аргументы между клиентом и сервером, предварительно завернув в QDataStream?


Название: Re: Переслать код от клиента серверу
Отправлено: ритт от Март 09, 2009, 23:30
допустимо всё, что только можешь придумать. важно правильно реализовать это.
посмотри на libqxt - у них уже есть реализация механизма вызова слотов через сеть (qxtpeer, если правильно помню).