我正在使用 C 中的套接字编程设计文件服务器。我使用流套接字将诸如 open()、write() 等调用作为纯字符串发送并在服务器端对其进行解密。即,如果它是一个开放调用,那么我们提取路径,模式,标志。可以吗,或者我应该使用某种结构来存储文件系统调用并发送到服务器只需访问字段的服务器。
有一些我不知道的标准方式吗?
谢谢
我正在使用 C 中的套接字编程设计文件服务器。我使用流套接字将诸如 open()、write() 等调用作为纯字符串发送并在服务器端对其进行解密。即,如果它是一个开放调用,那么我们提取路径,模式,标志。可以吗,或者我应该使用某种结构来存储文件系统调用并发送到服务器只需访问字段的服务器。
有一些我不知道的标准方式吗?
谢谢
您基本上开始定义自己的协议。如果您发送描述操作的数字而不是字符串会容易得多。
如果您对此很认真,则可能需要研究-RFC707RPC
(您确实要求采用标准方式,对吗?)。
你已经有了标准方法的答案,所以我会给你一些你应该注意的警告。
如果您打算将文件服务器部署在不受信任的环境中(例如在 Internet 上),请考虑立即保护它。保护它不仅仅是一个加密的问题 - 你需要知道你打算如何验证你的用户,你想如何授权对服务器不同部分的不同类型的访问,你将如何确保真实性和完整性数据以及您打算如何对数据保密。
您还需要考虑服务器的可用性。这意味着您应该具有容错性 - 即连接可以(并且将会)中断(无论它们是否被故意中断)所以您需要检测到这一点,或者某种保持活动状态(这将如果客户端离开则失败)或某种活动超时(如果客户端离开则将过期)。您还需要考虑您愿意同时支持多少客户端 - 这可以从根本上改变您的服务器架构。
至于打开、关闭、读取、写入等命令,大多数文件传输协议并没有详细说明,但根据您的情况,能够这样做可能会很有趣。如果您的文件很大并且您只需要其中的一些块,或者如果您希望能够锁定文件以专门处理它们等等,您可能需要深入了解这些细节。如果您没有这些要求,那么更简单的事务性命令,例如 get & put(而不是打开、读取、读取、读取、关闭和打开、写入、再写一些、关闭)可能既更容易实现,也更容易实现一起工作。
如果您希望人类与您的服务器交互并向其发出命令,那么文本是一种很好的方法:嗅探时很容易调试,并且人类理解文本并且可以很容易地打字。如果没有人参与,使用整数作为命令可能是一种更好的方法:您可以将命令构造为以整数开头,后跟多个参数,并且总是简单地期望服务器端发生相同的事情(并switch
在您收到的命令)。但是,即使在这种情况下,在整数中包含人类可读的值也是一个好主意。例如,将'READ'
整数作为读取命令使用与 一样多的字节0x00000001
,但使用 WireShark 嗅探时更容易读取。
最后,您将真正了解标准方法,并尝试了解每种情况下的权衡取舍。例如,问问自己,为什么 HTTP 有如此冗长的标头以及 WebDAV 使用它的原因。为什么 FTP 使用两个连接(一个用于命令,一个用于数据)而许多其他协议只使用一个?NFS 是如何发展到现在的位置的,为什么?了解这些问题的答案将有助于您开发自己的协议 - 如果在您理解了这些答案之后,您仍然觉得您需要自己的协议。