2012-11-21 228 views
0

我对客户端和服务器之间的通信有疑问。我想通过一个TCP unix套接字发送数据(我知道如何做到这一点),并且我不知道如果发送的消息准备完全读取(而不是每块的块),测试的最佳实践是什么。服务器客户端消息验证

因此,我想这

  1. 客户机的发送数据的printf(3)格式,该消息被写在一个串中发送。
  2. 服务器收到消息,但如何确定消息是否已满?我需要循环直到消息完成吗?

所以我的想法是使用一个代码,将预置和附加到消息这样(或校验也许?):

[验证码] my_long_data_formatted [验证码]

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

这是客户端/服务器通信的合适解决方案吗?如果是的话,你有什么建议我的验证界限?

+0

如果您发送消息的大小,那么你知道有多少读,因此当你读完。 – Jite

回答

2

有几种方法可以做到这一点,所以我不认为有一个“正确”的解决方案。你的解决方案可能会奏效。谨慎的一点是,您需要确保您选择的偏差代码不作为消息中数据的一部分发送。如果是这样的话,你会发现消息是完整的,即使它不是消息的结尾。如果无法知道数据的外观如何,您可能需要尝试不同的技术。

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

另一种方式是到超过所述第一消息的长度发送(例如二进制32比特数),其指示要读取的字节数,直到该消息的末端。您首先阅读这些内容以获取大量数据,然后从套接字中读取该数量。

如果有消息的组数,其中长度是一样的,每次,你可以分配一个编号,以每封邮件,并首先发送该号码,然后你可以阅读。利用这些信息,您可以根据分配给消息的号码确定要读取多少数据。

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

4

TCP已经有一个内置的校验和/验证。所以如果收到的消息,它被正确接收。

通常然后,你不用担心的唯一的事情是找出该消息是多久。这可以通过在开始处发送消息长度来完成,或者通过在末尾放置终止字符或序列来完成。

为了确保发送方和接收器“在同一页上”可以这么说,在收到消息后,接收器通常会返回一个响应,即使响应只是说“OK”。这种技术的

实例包括HTTP,SMTP,POP3,IMAP,和许多其他。

+0

非常感谢您的回复,但即使该消息比TCP最大数据包更大,我也可以仔细阅读数据(以读取大小为前提)? – markand

+0

@ user840599 TCP是面向流的协议,不是面向数据包的协议。程序员不知道它如何分组的细节。但是,是的,您通常会在您的接听电话上循环播放数据,直到您有足够的数据满足您的要求。 – tylerl

+0

谢谢,我明白了。现在我只需要编写一个好的机制来阅读,直到消息已满。我认为一个线程可以做到这一点。谢谢! – markand

2

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

流行的选择是:

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