将系统调用发送到文件服务器

时间:2011-06-06 16:18:12

标签: c linux sockets fileserver

我在C中使用套接字编程设计了一个文件服务器。我使用流套接字将open(),write()等调用作为普通字符串发送,并在服务器端解密它。如果它是一个打开的调用那么我们提取路径,模式,标志。它是好的还是我应该使用某种结构来存储文件系统调用并发送到服务器只是访问字段的服务器。

有一些我不知道的标准方式吗?

由于

3 个答案:

答案 0 :(得分:1)

您基本上已开始定义自己的协议。如果您发送描述操作的数字而不是字符串,那将会容易得多。

如果您对此非常认真,可能需要查看RPC - RFC707(您确实要求标准方式,对吧?)。

答案 1 :(得分:1)

是的,有一种标准方式。查看NFSAFPCIFSWebDAV,然后选择一个。

答案 2 :(得分:1)

你已经有了标准方法的答案,所以我会给你一些你应该注意的警告。

如果您打算在不受信任的环境中(例如在Internet上)部署文件服务器,请考虑立即保护它。保护它只是打开加密的问题 - 您需要知道如何对用户进行身份验证,如何授权对服务器不同部分的不同类型的访问,以及如何确保数据的真实性和完整性以及您打算如何保密数据。

您还需要考虑服务器的可用性。这意味着你应该是容错的 - 即连接可以(并且将会)中断(无论它们是否故意被破坏)所以你需要检测到它,或者某种保持活着(这将是如果客户离开)或某种活动超时(如果客户离开则会失效)。您还需要考虑您愿意同时支持多少客户端 - 这可以从根本上改变服务器的架构。

对于打开,关闭,读取,写入等命令,大多数文件传输协议都没有详细介绍,但根据您的具体情况可能会很有趣。如果您的文件很大而且您只需要一些块,或者如果您希望能够锁定文件以专门处理它们等,您可能需要详细说明。如果您没有这些要求,那么更简单的事务性命令,例如get& put(而不是打开,读取,读取,读取,关闭和打开,写入,写入更多,关闭)可能更容易实现,更容易使用。

如果您希望人类与您的服务器进行交互并为其提供命令,那么文本是一种很好的方法:在嗅探和人类理解文本时可以很容易地进行调试,并且可以很容易地输入文本。如果没有人参与,使用整数作为命令可能是一种更好的方法:你可以将命令结构化为一个整数后跟一些参数,并且总是只想在服务器端做同样的事情(并做一个{{ 1}}你收到的命令)。但即使在这种情况下,在整数中使用人类可读的值也许是一个好主意。例如,将switch放在一个整数中,因为read命令使用的字节数与'READ'一样多,但在使用WireShark进行嗅探时更容易阅读。

最后,您真正了解标准方法,并尝试了解每种情况下的权衡取舍。例如,问问自己为什么HTTP有这样冗长的标题以及WebDAV使用它的原因。为什么FTP使用两个连接(一个用于命令,一个用于数据),而许多其他协议只使用一个? NFS如何发展到现在的位置,为什么?理解这些问题的答案将有助于您开发自己的协议 - 如果在您理解了这些答案后,您仍然觉得您需要自己的协议。

相关问题