【问题标题】:c socket send commands in stringc socket 以字符串形式发送命令
【发布时间】:2011-08-18 19:49:27
【问题描述】:

我是 C/C++ 套接字编程的新手。我写了客户端和服务器套接字。他们可以发送和接收字符串。 这个想法是在字符串中将命令发送到服务器。它可能看起来像这样:“GET X”或“SET X 2”。我知道如何拆分字符串。并且程序知道字符串中的第一个单词是命令,第二个是属性,第三个可以是一个值,如果是 SET-Command。 我的问题是我怎么能对programm说如果它得到字符串“GET X”它应该调用函数get(attribute)。 我首先想到的是开关盒,但我认为这不是最好的解决方案。 如果它会是很多命令。 谢谢

【问题讨论】:

  • 您可以使用 C 或 C++ 进行编程,但不能同时使用它们,因为它们是不同的语言。请使用适当的标签并准确说明您使用的语言。
  • 您基本上是在实现远程过程调用。除非您出于教育目的这样做,否则为什么要重新发明轮子?有许多 RPC 技术可用于多种编程语言。此处提供了这些技术的简要列表:en.wikipedia.org/wiki/Remote_procedure_call
  • @Seth Carnegie 从技术上讲,可以在 C++ 项目中包含 C 文件,或者服务器和客户端可能使用不同的语言。这两件事可能都不是这里的情况,但这些都是可能性。

标签: c++ c string sockets send


【解决方案1】:

您基本上可以将问题归结为将操作名称映射到正在调用的实际函数的最佳方式,以及是否真的需要具有更好查找特性的解决方案。

  • 对于少量函数,基于 O(n) 的简单解决方案(例如线性搜索)就足够了。
  • 基于O(log(n)) 的方法(例如self-balancing binary trees)也足以满足更多操作。
  • 由于理论上的O(1) 查找特性,大多数人会直接跳到基于hash table 的解决方案。然而,这取决于一个好的散列函数,它本身在成本方面并不是免费的。

总是需要在时间和空间上进行权衡。因此,在决定哪种方法最适合您的应用程序之前,最好先进行概要分析。

不管怎样,这类操作调度问题已经被大量研究。例如,one paper 讨论了 CORBA C++ ORB 实现中的操作调度策略。

除了优化操作查找之外,您可能还必须处理其他因素,例如:

  • 并发:您的应用程序是否需要并行处理来自客户端的多个连接?分布式并发通常很难正确实现。
  • 序列化:您将如何通过网络发送和接收数据?您可能会遇到的问题包括:发送纯文本可能很慢,数值可能必须转换到接收平台endianness,您的序列化协议可能会改变,从而影响您的用户等。

您可能还必须在客户端处理许多其他问题。如果可能的话,我建议使用现有的类似 RPC 的技术,而不是自己重新发明轮子。

【讨论】:

    【解决方案2】:

    您可以做到这一点的一种方法是根据所有返回char* 的命令调用可以调用的函数的查找表,然后将响应发送回客户端。当然,您必须创建一个基本的散列函数。

    【讨论】:

      【解决方案3】:

      我认为最好使用 switch 语句。

      如果不是,你可以使用一个以命令字符串为键、以回调函数指针为值的映射。

      【讨论】:

      • 并且一定要检查密钥是否存在,否则你的程序可能会爆炸。
      猜你喜欢
      • 2012-03-24
      • 1970-01-01
      • 2013-08-16
      • 2013-07-17
      • 2016-10-06
      • 1970-01-01
      • 2015-08-16
      • 2020-05-15
      • 1970-01-01
      相关资源
      最近更新 更多