1
owt5008137 2017-08-01 23:09:35 +08:00 via Android
很久没碰过 boost::asio 了。不过一般情况下,如果是 tcp,你得自己加包头。判定是否读完了一整个包,你要自己做黏包。
我不记得他是来一个包回调一次还是一定要收到你指定的长度才回调。如果是后者,你在调用这个函数前就要保证传入的长度小于等于总长度 |
2
woshixiaohao1982 2017-08-01 23:16:18 +08:00
去网上找一个 lineparse 就好了,一般可以采取 /r/n 等作为结束符
|
3
alqaz 2017-08-01 23:36:03 +08:00
不是发送每个数据包之前发送一个固定长度的表示数据包长度的数据吗?
|
4
fyyz OP @owt5008137 包头是类似整个包 size 的东西吗?
|
5
fyyz OP @woshixiaohao1982 这个方法我在不少地方看到过,但是我这里不行,因为我要传二进制数据,可能数据内部正好出现这个字符
|
7
AngelCriss 2017-08-02 08:25:53 +08:00 via Android
@fyyz 同学,你知道为什么 HTTP 头里面有一个长度吗?
|
8
fyyz OP @AngelCriss 我当然知道,可是我现在写的是 proxy,可能会收到各种各样的包,不可能为每种包都写一个获取长度的方法啊。
|
9
newkedison 2017-08-02 08:53:51 +08:00
这个问题我也很纠结,现在用 asio 写串口和 TCP,由于传输的是二进制,所以无法用包头包尾或者长度的办法,只能通过接收时间间隔判断。
目前的做法是 async_read_some 传入的 buffer 小一点(比如 10 ),然后在 handler 里面再次 async_read_some,同时启动一个定时器,定时一小段时间(比如 10ms ),时间到了就调用 cancel() ,从而表示一包结束。 不过这样做的话,通讯速率肯定就上不去了 |
10
owt5008137 2017-08-02 08:55:36 +08:00 via Android
@fyyz 包头包含长度。proxy 的话可以提供某种机制让被代理方定这个包头。要么或者你就用流的转发
|
11
1423 2017-08-02 09:01:58 +08:00
转义字符
|
12
shibingsw 2017-08-02 09:31:14 +08:00
tcp 是字节流,没有包的概念,你可以自己在每个消息头部加上消息的长度,比如用 4 个自己做长度,每次接收消息的时候先接收 4 个字节,算出长度,然后根据这个长度调用 async_read_some,每次得到的长度累加起来,直到算出的长度。
|
14
araraloren 2017-08-02 10:29:53 +08:00
@fyyz 就算你只传输一个长度值都能实现一个非常简单的协议,不会有什么内部出现某某字符的问题
1 a 2 bc 3 c3s 因为按照协议来,你的数据就是完全对应的,不可能读到 c 的时候,或者读到倒数第二个 3 的时候,代码逻辑会误判为长度 |
15
hjc4869 2017-08-02 10:50:05 +08:00
用 socket::available()?
|