|
Модераторы: feodorv |
|
DoZENT |
|
|||
Опытный Профиль Группа: Участник Сообщений: 326 Регистрация: 2.6.2006 Репутация: нет Всего: 1 |
Привет всем! Передо мной встала несколько необычная проблема: мне необходимо переслать произвольный код (функцию с заранее неизвестным количеством аргументов) от клиента серверу и выполнить его на сервере. Куда копать и вообще возможно ли это? Заранее спасибо.
-------------------- Какая боль, какая боль, Internet Explorer 5.0... |
|||
|
||||
vinick |
|
|||
Опытный Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 6 Всего: 22 |
Зачем что-то копать? Надо просто переслать код серверу, он подгготовит его к выполнению, потом переслать аргументы, сервер передаст полученные аргументы в функцию и вернет результат. Только договоритесь с сервером о протоколе и все дела.
Только зачем это надо. Очень похоже на попытку сделать большую кнопку с надписью "Сдалать все." |
|||
|
||||
neosapient |
|
|||
Опытный Профиль Группа: Участник Сообщений: 672 Регистрация: 16.8.2006 Репутация: нет Всего: 4 |
как вариант, перешли DLL и запусти на целевой машине
|
|||
|
||||
DoZENT |
|
|||
Опытный Профиль Группа: Участник Сообщений: 326 Регистрация: 2.6.2006 Репутация: нет Всего: 1 |
Вы сейчас просто переписали мой вопрос. КАК это сделать? Желательно кроссплатформенно. Добавлено через 3 минуты и 44 секунды так сейчас и делаю. только вот загвоздка: на сервере программа заранее не знает, сколько аргументов будет у функции, как ее выполнять-то?. я в тупике. -------------------- Какая боль, какая боль, Internet Explorer 5.0... |
|||
|
||||
DoZENT |
|
|||
Опытный Профиль Группа: Участник Сообщений: 326 Регистрация: 2.6.2006 Репутация: нет Всего: 1 |
если оформить функцию как новый тип:
и писать в сокет переменную этого типа, то на сервер передастся сама функция или только ее адрес? -------------------- Какая боль, какая боль, Internet Explorer 5.0... |
|||
|
||||
vinick |
|
||||
Опытный Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 6 Всего: 22 |
В правильном вопросе содержится половина ответа. 1. Переслать текстовый файл с кодом 2. Запустить на сервере компилятор и собрать динамическую библиотеку 3. Загрузить библиотеку в процесс сервера 4. Передать на сервер параметры 5. Передать параметры в функцию 6. Выполнить код. Кроме этого можно собирать не динамическую библиотеку а оформлять функцию в виде отдельного приложения, которому сервер будет скармливать параметры через аргументы командной строки, пайпы или еще как-нибудь. Параметры в функцию можно передавать через массив указателей на void, функция внутри себя сама сможет разобрать этот массив. А можно прямо на клиенте серилизовать этот массив (посмотри на boost.serialization) и передавать его таким по сети, а функция опять же внутри себя сможет восстановить параметры и таким же образом вернуть результат. В обоих случаях прототип вызываемой функции будет всегда один и тот же и серверу не потребуются лишние знания. Еще можно писать функции на скриптовом языке, а в сервер встроить интерпретатор этого языка. Можно вобще переписать сервер на языке поддерживающем инструкцию eval. вариант со скриптами на мой взгляд самый кросс-платформенный.
Только адрес, который на другой машине не будет иметь никакого смысла. |
||||
|
|||||
0xDX |
|
|||
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 6.2.2009 Репутация: нет Всего: нет |
во первых DLL это не есть хорошо(в данном случае).
во вторых правильно поставденный вопрос 50% ответа. Но автора пора научить плохому(плохому так как это хакерский трюк) shell-code - почитай. А вообще можно использовать что то типа COM(от мелкомягких), CORBA........ Можеш. взять интерпретатор(типа встроенного в QT, но лучше мозиловский, так как не как а ява скрипт это стандарт.....) Или LUA, и пересылать уже текст на этой программе. Можешь есче покопать в rpc. Вообщем смотри сам, у кого какая задача, и каждый решает задачу по своему..... |
|||
|
||||
Lazin |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 5 Всего: 154 |
ИМХО, бред и дыра в безопастности...
во первых, как можно вызвать то, что ты не знаешь как вызывать, если ты не знаешь что передавать в функцию, то ты не можешь эту ф-ю вызвать. во вторых, если даже ф-ии имееют всегда один и тот-же набор параметров, кроссплатформенным это не будет, тебе придется передавать dll динамичесски загружать ее. если использовать скрипты, то все-равно это дыра... злоумышленник может передать твоему приложению специально подготовленный скрипт и получить доступ к компьютеру. |
|||
|
||||
DoZENT |
|
|||
Опытный Профиль Группа: Участник Сообщений: 326 Регистрация: 2.6.2006 Репутация: нет Всего: 1 |
понятно проще dll на сервер скопирую. а вот по пункту 4 есть непонятки. Как эти параметры-то передать на сервер, учитывая, что эти параметры у каждой функции свои (разное количество, тип)? Пока только смутно вижу такой вариант: прототип функции делать что-то типа
-------------------- Какая боль, какая боль, Internet Explorer 5.0... |
|||
|
||||
neosapient |
|
|||
Опытный Профиль Группа: Участник Сообщений: 672 Регистрация: 16.8.2006 Репутация: нет Всего: 4 |
Я б передал параметры в виде текста, так как распарсить строчку с текстом легко. В общем смысле это будет xml-теги.
Второй вариант, передать вместе с dll (или по раздельности) файл инициализации/конфигурации. Это сообщение отредактировал(а) neosapient - 9.3.2009, 12:19 |
|||
|
||||
DoZENT |
|
|||
Опытный Профиль Группа: Участник Сообщений: 326 Регистрация: 2.6.2006 Репутация: нет Всего: 1 |
хороший вариант при жестко ограниченном количестве допустимых типов агрументов. Т.е., например строка с параметрами будет выглядеть так:
Это сообщение отредактировал(а) DoZENT - 9.3.2009, 14:50 -------------------- Какая боль, какая боль, Internet Explorer 5.0... |
|||
|
||||
neosapient |
|
|||
Опытный Профиль Группа: Участник Сообщений: 672 Регистрация: 16.8.2006 Репутация: нет Всего: 4 |
||||
|
||||
vinick |
|
||||||||||
Опытный Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 6 Всего: 22 |
Почитай что такое сериализация. Я так понимаю ты используешь Qt, там вроде должно быть что-то подобное. Можешь посмотреть boost.serialization, если не хочешь тянуть буст, можно по образу и подобию сделать свой вариант, я так делал - это не сложно. c применением буста это будет выглядеть примерно так Пусть функции требуется структура MyStruct, int и double
|
||||||||||
|
|||||||||||
DoZENT |
|
|||
Опытный Профиль Группа: Участник Сообщений: 326 Регистрация: 2.6.2006 Репутация: нет Всего: 1 |
безопасность - отдельная тема, я потом вас с ней замучаю
вот я и спрашивал, возможно ли это? оказалось, что без извратов - нет, поэтому QT сервер, QT либа, все ОК =) Добавлено через 8 минут и 47 секунд vinick, вот за сериализацию спасибо! Как-то не подумал про нее. В QT для этого QDataStream. Только вот клиента разрабатывать другая фирма будет, придется им QT что-ли навязывать.. Ну это уже мелочи) Спасибо! -------------------- Какая боль, какая боль, Internet Explorer 5.0... |
|||
|
||||
Lazin |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 5 Всего: 154 |
сервер работает под linux, клиент под мак, и что дальше? |
|||
|
||||
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |