c - 在 c 中的流式套接字上读取消息

标签 c sockets streaming

我正在编写一个客户端服务器模型应用程序,服务器通过流连接以非常高的速率向客户端发送大量消息(具有不同大小),客户端在比预期消息更大的缓冲区上读取这些消息大小

while (ret = read (sd, buf, sizeof buf) > 0)
{
      // decode message here
}

这里的问题是客户端可能会像这样读取多个缓冲区中的消息,如果我假设缓冲区是B,消息是M#,它会收到如下消息

|----B-----|----B----|----B----|----B----| ....

|-M1--|-M2-|--M3-|-M4-|---M5---|--M6-| ....

这使得消息的解码不正确。所以,我想接收如下消息(每个缓冲区只有一条消息)

|----B-----|----B----|----B----|----B----| ....

|-M1--|,,|-M2-|,,,|--M3-|,,|-M4-| ....(,,,什么都不是,只是为了格式化)

请注意,我必须使用流式连接并且我不喜欢在消息之间不使用任何分隔符

最佳答案

您无法控制流的字节如何传送到应用程序,它是一个字节流,而不是单个消息。

即使您不“喜欢”定界符,这也正是它们被如此频繁使用的原因。这不是一个有趣的想法,它是解决这个问题的基本方法。不“喜欢”它不是很有趣,因为反对意见。

除定界符外,您唯一的希望是实现消息解析,它可以始终正确地确定它是否有完整的消息,如果有,是哪条消息。如果消息是“前缀”;这样一个特定的字节序列 B 既可以是完整的消息 M1 又可以是 M2 的开始,那么我想你完蛋了。

关于c - 在 c 中的流式套接字上读取消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13932047/

相关文章:

algorithm - 流式 JSON 算法 - 没有堆栈

c - c 中的字符串与 fgets 进行比较

c - C 中的套接字服务器卡在对函数 send() 的调用上并且没有通过它

sockets - 数据传输Windows Embedded Compact 7和计算机VIA USB连接

c++ - 为什么我的程序在 HTTP/1.1 中读取额外的字节

streaming - 与加密流相比,DRM 的附加值是多少?

c - 句子中的字数统计 - C 程序

c - 链表 QuickSort C

c++ - 调整动态数组大小时保留用户输入值的问题

javascript - 如何向网络浏览器发送加载页面,然后在一段时间后发送结果页面