服务器客户端消息验证

时间:2012-11-21 14:36:07

标签: c sockets unix tcp

我对客户端和服务器之间的通信有疑问。我想通过TCP unix套接字发送数据(我知道如何做),我不知道测试发送的消息是否已准备好完全读取(不是每块阻止)的最佳实践。

因此,我正在考虑这个

  1. 客户端发送格式化的printf(3)数据,消息以字符串形式写入并发送。
  2. 服务器收到邮件,但如果邮件已满,如何确定?在消息完成之前,我是否需要循环?
  3. 所以我的想法是使用一个代码(或校验和可能?),它将被添加到消息之前并附加到消息中:

    [验证码] my_long_data_formatted [验证码]

    然后,服务器尝试读取数据,直到读取第二个验证码并成功检查。

    这是客户端/服务器通信的正确解决方案吗?如果是的话,你有什么建议我的修改界限?

3 个答案:

答案 0 :(得分:4)

TCP已经内置校验和/验证。因此,如果收到消息,则表示已正确接收。

通常情况下,您唯一需要担心的是弄清楚消息的持续时间。这可以通过在开头发送消息长度或在结尾处放置终止字符或序列来完成。

为了确保发送方和接收方都“在同一页面上”,接收方通常会在收到消息后发回响应,即使该响应仅显示“OK”。

此技术的示例包括HTTP,SMTP,POP3,IMAP和许多其他技术。

答案 1 :(得分:2)

有几种方法可以做到这一点,所以我认为没有“正确”的解决方案。您的解决方案可能会有效。需要注意的一点是,您需要确保您选择的valiation代码不会作为消息中数据的一部分发送。如果是这种情况,您将检测到消息已完成,即使它确实不是消息的结尾。如果无法知道数据的样子,您可能需要尝试不同的技术。

根据您的描述,听起来您的消息长度可变。另一种方法是使所有消息的长度相同,这样您就知道每次获取完整消息需要读取多少数据。

另一种方法是首先发送消息的长度(例如二进制32位数),该消息指示在消息结束之前要读取的字节数。您首先读取此数据以获取数据量,然后从套接字读取该数量。

如果您有一定数量的消息,每次长度相同,您可以为每条消息分配一个号码,然后先发送该号码,然后您可以阅读。根据该信息,您可以根据分配的消息编号确定要读取的数据量。

您选择用于解决方案的内容可能基于诸如消息是可变的还是固定长度等因素和/或您是否需要发送有关数据的其他信息。在这种情况下,您可能会混合使用固定长度标头,其中包含有关后续数据的信息;无论是长度还是后面的数据类型。

答案 2 :(得分:2)

您需要建立一个应用程序级协议,以便以某种方式告诉您应用程序消息在TCP提供给您的字节流中的开始和结束位置(然后可能是关联方如何继续进行对话)。

热门选择是:

  • 固定长度的消息。适用于二进制数据,非常简单。
  • 具有固定格式或大小标题的可变大小消息,用于指示消息其余部分的确切大小(可能是类型)。适用于二进制和文本数据。
  • 定界消息 - 某些字符(如换行符或\x1)是特殊的,表示消息边界。最好的文本数据。
  • 自描述消息,如XML或S表达式,或ASN.1。