2010-09-17 55 views
0

我会写一个TCP服务器,客户端发送我的XML消息,我想知道如果下面的条件会发生,以及如何避免:TCP服务器:如何避免信息重叠

1)客户端发送<cmd ...></cmd> 2)服务器正在忙于处理某些 3)客户端发送<cmd ...></cmd> 4)服务器在执行的recv(),并把字符串缓冲

将缓冲区充满<cmd ...></cmd><cmd ...></cmd>甚至更​​糟<cmd ...></cmd><cmd ...如果我的缓冲区并不大足够?

我想要的是TCP堆栈将消息划分为与客户端发送消息相同的部分。

它可行吗?

+0

你是否担心缓冲区溢出? – aaronasterling 2010-09-17 07:23:05

+1

这就是TCP所要做的:确保从发送方传输的有序,有序,可靠的数据。 http://en.wikipedia.org/wiki/Transmission_Control_Protocol – msw 2010-09-17 07:23:47

回答

0

您经常以复数形式编写客户端:是否有多个客户端连接到您的服务器?在这种情况下,每个客户端都应该使用自己的TCP流,并且您所描述的问题永远不会发生。

如果各种命令是从单个客户端发送的,那么您应该编写客户端代码,以便在发出下一个命令之前等待命令的答案。

+1

这是垃圾;)你只需要确保你的服务器正确处理消息帧。 TCP是一个字节流,每次读取可以返回1和等待处理的总字节数,所有TCP代码都应该处理这个。如果你在TCP之上有一条消息而不是基于流的协议,那么你需要实现某种形式的消息成帧,以便将传入的流分割成你理解的消息。绝对没有必要将协议限制为严格的单个消息响应序列。即使你限制你的客户,你也必须处理不完整的'消息'。 – 2010-09-17 08:08:44

+0

我承认。第二段是过度简化。但第一段回答了OP的一个重要问题。 – 2010-09-17 08:39:50

+0

“第二段是过度简化”?怎么会这样?这是一个常见的协议。例如,这就是HTTP的作用。 – 2010-09-17 10:00:25

4

这是不可能保证在TCP层面,因为它只知道流。

根据您使用的XML解析器,您应该能够为其提供流并让它告诉您它何时具有完整的对象,并将第二个<cmd...保留在其缓冲区中,直到它还被关闭。

+0

你在说什么?由于每个客户端都有独立的套接字,因此所描述的场景不会发生。 – 2010-09-17 10:01:14

+0

我可能误解了这个问题,但我认为这个场景是一个单一的客户端,并询问一个调用send()是否直接映射到一个调用recv() – Knio 2010-09-17 10:33:40

+0

是的,我认为这正是OP所要求的。 – caf 2010-09-19 12:21:38

3

您需要一个更高阶的协议来根据需要划定消息边界。还有plenty to choose from包括你自己发明的。

+0

实际上,问题不是数据序列化格式问题,因为看起来OP已经在使用XML这样的东西了(XML是该链接提出的格式之一),问题是数据传输问题:如何知道文档何时完成。 HTTP是一种可能的解决方案(不包括在你的链接中,实际上链接中的大多数格式都假设通过HTTP传输,而不是原始TCP)。 – slebetman 2010-09-17 08:23:34