更改此协议以使用 TCP 流式处理
Changing this protocol to work with TCP streaming
我为我的游戏制作了一个简单的协议:
b = bool
i = int
sINT: = string whose length is INT followed by a : then the string
m = int message id.
例:
m133s11:Hello Worldi-57989b0b1b0
这将是:
Message ID 133
String 'Hello World' length 11
int -57989
bool false
bool true
bool false
但是我不知道TCP可能只能发送消息的一部分。我不确定如何修改它,以便我可以执行以下操作:
on receive data from client:
use client's chunk parser
process data
if has partial message then try to find matching END
if no partial messages then try to read a whole message
for each complete message in queue, dispatch it
我可以通过在消息的开头添加 B 和在末尾添加 E 来做到这一点,然后解析第一个字符为 B,最后一个字符为 E。
唯一的问题是如果我在中间收到一些不遵循协议的愚蠢的东西。或者,如果我应该只收到不是消息而只是一个字符串的东西怎么办。因此,如果我打算以某种方式接收字符串 HelloB,那么我会将其解析为 hello 和消息的开头,但我永远不会收到该消息,因为它不是消息。
如何修改协议以解决这些潜在问题?尽管我预计只会收到格式正确的消息,但如果一个消息编码不佳并且所有内容都失常,那将是一场噩梦。
谢谢
我决定在开头添加长度并跟踪我是否正在处理消息:所以:
p32m133s11:Hello Worldi-57989b0b1b0
然后我有 3 种状态,读取以查找"p",读取以查找"p"之后的长度或读取字节直到读取长度字节。
你觉得怎么样?
它似乎工作得很好。
你正在做的是相当老派的磁带东西。好。
您可能遇到的问题是,如果收到消息的一部分,则无法判断您是否正在执行令牌。
例如,如果您收到:
m12
这是消息 12,还是消息 122 的第一部分?
如果您收到:
i-12
这是整数 -12 还是整数 -124354 的第一部分?
所以我认为您需要更改它,以便消息编号是固定宽度(例如四位数字),字符串长度是固定的(例如 6 位数字),整数宽度固定为 10 位。
所以你的例子是:
m_133s____11:Hello Worldi____-57989b0b1b0
这样,如果您收到消息的第一部分,则可以存储它并等待收到其余部分,然后再处理它。
您还可以考虑使用控制字符来分隔消息部分。有ASCII控制代码通常用于此目的,RS,FS,GS和US。所以一条消息可能是
[RS]FieldName[US]FieldValue[RS]fieldName[US]FieldValue[GS].
您知道何时有完整的消息,因为[GS]标记结束。然后,您可以使用 [RS] 作为分隔符将其划分为字段,并使用 [US] 将每个字段拆分为名称/值。
有关简短的信息,请参阅 http://en.wikipedia.org/wiki/C0_and_C1_control_codes。
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 提升 Asio TCP 服务器 处理多个客户端
- AMQP-CPP:TCP 处理程序中的管道损坏错误
- 如何在 TCP 侦听器中处理异步发送和接收
- TCP中的Boost async处理程序
- 处理插座Boost ASIO TCP IP -C 套接字编程
- 处理 tcp/udp 接收的最佳方法
- 使用 Boost ASIO 处理没有套接字的 TCP
- c++tcp多线程客户端/服务器-如何与线程套接字处理程序进行通信
- 加速和 Windows 套接字 - 正确处理 TCP 客户端断开连接方案
- 更改此协议以使用 TCP 流式处理
- boost::asio::tcp::socket 关闭并取消而不调用处理程序
- 调用 boost::asio::tcp::socket 方法后async_read处理程序在服务器中返回错误
- 处理多个客户端的单个TCP/IP服务器(在c++中)
- 如何处理Perl TCP套接字中的消息碎片
- 在处理TCP/IP之前完全接收到它.如何知道发送的全部数据是否已被接收
- 处理MySQL c++连接器上TCP连接丢失的问题
- 如何为服务器处理标记TCP
- 阻塞TCP套接字:" send() "返回和错误处理