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