2011-05-04 2 views
0

Я новичок в программировании сокетов на C/C++. Я написал Client and Server Socket. Они могут отправлять и получать строку. Идея состоит в том, чтобы отправить команды на сервер в строке. Он может выглядеть примерно так: «GET X» или «SET X 2». Я знаю, как я могу разделить строку. и программа знает, что первое слово в строке является командой, вторая - атрибутом, а третья может быть значением в случае SET-Command. Мой вопрос в том, как я могу сказать программе, что если она получает строку «GET X», она должна вызывать функцию get (attribute). Я думал о коммутаторе, но думаю, что это не лучшее решение для него. В случае, если будет много команд. THANK выc socket send команды в строке

+1

Вы можете программировать либо на C, либо на C++, но не на обоих языках одновременно. Пожалуйста, используйте соответствующие теги и укажите, какой язык вы используете. –

+1

Вы в основном используете удаленные вызовы процедур. Если вы не делаете это в образовательных целях, зачем изобретать колесо? Существует много технологий RPC, доступных на нескольких языках программирования. Краткий список этих технологий доступен здесь: http://en.wikipedia.org/wiki/Remote_procedure_call – Void

+0

@Seth Carnegie Технически можно включать файлы C в проект C++, или, возможно, сервер и клиент находятся на разных языках , Ни одна из этих вещей не может быть здесь, но это возможности. – patrickvacek

ответ

0

Я думаю, что лучше использовать оператор switch.

Если нет, вы можете использовать карту с командной строкой в ​​качестве ключа и указателем на функцию обратного вызова в качестве значения.

+0

И убедитесь, что ключ существует, иначе программа может взорваться. – Marlon

0

Один из способов, которым вы могли бы это сделать, - иметь таблицу поиска функций, которую вы могли бы вызвать, в зависимости от команды, которая все вернула char*, и отправить ответ обратно клиенту. Конечно, вы должны сделать рудиментарную функцию хэширования.

1

В основном вы можете свести проблему до оптимального способа сопоставления имени операции с вызываемой фактической функцией и действительно ли нужны решения с лучшими характеристиками поиска.

  • Для небольшого числа функций может быть достаточно простого решения на основе O(n) (например, линейного поиска).
  • Подход на основе O(log(n)) (например, self-balancing binary trees) может быть достаточным для дополнительных операций.
  • Большинство людей прыгают прямо на hash table на основе решения из-за теоретических характеристик поиска O(1). Однако это зависит от хорошей хеш-функции, которая сама по себе не является бесплатной с точки зрения стоимости.

Всегда есть компромиссы во времени и пространстве. Так что лучше всего профилировать, прежде чем решать, какой подход лучше всего подходит для вашего приложения.

Независимо от того, что проблемы с отправкой операций были изучены в значительной степени. Например, вот one paper, где обсуждаются стратегии отправки операций в реализации ORB CORBA C++.

Помимо оптимизации работы поиск, вы, вероятно, приходится иметь дело с другими факторами, такими как:

  • параллельности: это приложение требуется обрабатывать несколько соединений от клиентов параллельно? Распределенный параллелизм часто очень сложно реализовать правильно.
  • Сериализация: как вы будете отправлять и получать данные по проводам? Проблемы вы можете столкнуться включают: отправка простого текста может быть медленными, численные значения могут должны быть преобразованы в приемных платформах endianness, ваши протоколы сериализации могут измениться, которые будут влиять на пользователь и т.д.

Есть потенциально много других проблемы, с которыми вам придется столкнуться и на стороне клиента.Если это вообще возможно, я бы рекомендовал использовать существующую RPC-подобную технологию, а не изобретать колесо самостоятельно.