我打算写一个TCP服务器,客户端给我发送XML消息,我想知道是否会发生以下情况以及如何避免这种情况:
1)客户端发送<cmd ...></cmd>
2)服务器忙于做某事
3)客户发送<cmd ...></cmd>
4)服务器执行recv()并将字符串放入缓冲区
如果我的缓冲区不够大,缓冲区是否会填充<cmd ...></cmd><cmd ...></cmd>
甚至更差<cmd ...></cmd><cmd ...
?
我想要的是TCP堆栈将消息分成与客户端发送消息相同的部分。
可行吗?
答案 0 :(得分:4)
这在TCP级别是不可能保证的,因为它只知道流。
根据您正在使用的XML解析器,您应该能够将其提供给流并让它告诉您何时有完整的对象,将第二个<cmd...
保留在其缓冲区中,直到它关闭为止
答案 1 :(得分:3)
您需要更高阶的协议来根据需要描绘消息边界。还有plenty to choose from,包括你自己发明的那个。
答案 2 :(得分:0)
您经常以复数形式编写客户端:是否有多个客户端连接到您的服务器?在这种情况下,每个客户端应该使用自己的TCP流,并且您所描述的问题永远不会发生。
如果从单个客户端发送各种命令,那么您应编写客户端代码,以便在发出下一个命令之前等待命令的答案。