【问题标题】:What should a socket-based protocol look like for a C daemon?对于 C 守护程序,基于套接字的协议应该是什么样的?
【发布时间】:2011-01-05 19:20:15
【问题描述】:

我正在编写一个 C 守护程序,我的 Web 应用程序将使用它作为代理与 FTP 服务器通信。我的 Web 应用程序使用户能够通过 AJAX 连接 FTP 站点并与之交互。我需要一个 C 守护程序的原因是我无法通过 AJAX 调用保持 FTP 连接。

我的 Web 应用程序需要能够告诉我的守护程序对给定用户帐户的给定 FTP 服务器执行列出、获取、放置、删除、移动和重命名文件。所以当我的应用程序与守护进程对话时,它需要通过我定义的一些协议传递以下内容:1)操作,2)连接 ID,3)用户 ID,4)操作的任何附加参数(注意:连接信息存储在一个数据库,所以守护进程也会与之对话)。

这就是我需要我的守护进程来做的事情。我正在考虑我的网络应用程序和守护程序之间的通信将通过 TCP 套接字进行,但我不知道我将发送什么数据。我需要一个例子。例如,我应该通过套接字向守护进程发送这样的内容吗?

action=list&connection_id=345&user_id=12345&path=/some/path

或者我应该在字节级别做一些硬核的事情,像这样?

+-----------------+-------------------------+-------------------+-----------------------------------+
| 1 byte (action) | 4 bytes (connection id) | 4 bytes (user id) | 255 bytes (additional parameters) |
+-----------------+-------------------------+-------------------+-----------------------------------+
| 0x000001        | 345                     | 12345             | /some/path                        |
+-----------------+-------------------------+-------------------+-----------------------------------+

这种通过套接字进行的通信通常是什么样的?

【问题讨论】:

    标签: sockets protocols daemon


    【解决方案1】:

    实际上,它主要是关于您最容易编码和解析的任何格式,这就是为什么我不使用我自己的协议重新发明轮子,而是使用现有的远程过程调用解决方案。我的第二个选择是位域,因为它很容易装入和装入结构体。

    【讨论】:

      【解决方案2】:

      您不一定需要实现自己的协议。您是否考虑过使用 XML-RPC 之类的东西,甚至只是简单的 XML?有 C 库可以让您解析它。

      【讨论】:

      • 我还没有考虑过这个,但现在我还有其他事情要研究。感谢您提及这一点!
      【解决方案3】:

      二进制协议更容易处理。只需将长度添加到消息(或只是它的可变部分) - TCP 不知道您的应用程序级消息边界。关注号码endianness

      另一方面,基于文本的协议更加灵活。

      另外,看看Google Protocol Buffers - 可能非常有用,但我不确定是否支持 ajax。

      【讨论】:

        猜你喜欢
        • 2022-10-02
        • 2017-12-03
        • 2011-05-18
        • 1970-01-01
        • 2013-01-30
        • 2017-11-25
        • 1970-01-01
        • 1970-01-01
        • 2011-01-23
        相关资源
        最近更新 更多