recv 套接字 api 的内部工作
我正在使用 c++ 开发 TCP 客户端服务器应用程序。该项目现在允许第三方库。
这里客户端服务器之间的交换使用明确定义的协议格式。一旦客户端收到数据包,它将发送它进行解析。我有协议管理器,它将负责解析活动。
我有以下疑问
当数据从网络到达客户端时, 操作系统缓冲它直到应用程序调用recv()函数。
所以两条消息msg1和msg2到达缓冲区,调用recv将返回msg1+msg2。 现在这可能会导致解析活动失败。
我的查询
1. 上述假设是否正确?
2. 如果上述假设正确,那么如何解决这个问题。
I am working on TCP client server application using c++.third party lib are now allowed in this project.
Here exchange between client server takes using well define protocol format.once the client receives the packet it will send it for parsing.I have protocol manager which will take care of the parsing activity.
I have following doubt
When the data arrives at client from the network,
the OS buffers it until application calls recv() function.
So two message msg1 and msg2 arrives at the buffer a call to recv will return msg1+msg2.
Now this may result in failure of the parsing activity.
My queries
1. whether above mentioned assumption is correct or not ?
2. If above mentioned assuption is correct then how can resolve this issue.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
TCP 模拟流,因此 TCP 中没有消息的概念。如果您想要消息,您的应用程序必须有一些协议来分隔它们。
UDP 确实有消息,因此可以检索单独的消息。
TCP emulates a stream, so in TCP there is no notion of messages. If you want messages, your application has to have some protocol to seperate them.
UDP does have a messages, so there it is possible to retrieve separate messages.
您可以对消息使用 LV 协议(长度值)。
将消息长度编码在前 (1-4) 个字节中,然后放入消息。
例如这样的内容: 14"Hello world\0"
在您的服务器中,当客户端发送某些内容时,您必须recv() 前(1-4) 个字节,然后recv() 消息的长度。
You can use a LV protocol (Length-Value) for your message.
Encode the message length in the first (1-4) bytes, then put the message.
Something like this for example : 14"Hello world\0"
In your server, when a client is sending something you'll have to recv() the first (1-4) bytes then recv() the length of the message.