GB28181协议TCP粘包

首先,如果是SIP协议服务端的话,不建议使用eXosip库,性能太差了。建议基于osipparser2实现SIP协议解析,自己实现TCP和UDP通信。对于TCP通信来说,一个完整SIP消息可能是分多次异步接收的,需要自己实现粘包。因为osipparser2解析SIP协议是必须输入一个完整的SIP消息。

SIP协议的格式主要有两种表现形式:仅有SIP消息头(SDP消息长度为0),SIP消息头+SDP消息体

SIP协议无SDP的SIP消息格式:

GB28181协议TCP粘包_第1张图片

SIP协议有SDP的SIP消息格式:

GB28181协议TCP粘包_第2张图片

粘包的关键就在于SIP头尾部的CRLF(\r\n\r\n),然后就是通过"Content-Length:"得到SDP的长度。

注意,字符转数字时要兼容的是数字前的空格。

另外,在断包之前,需要将字符串左侧的\r、\n和空格清理掉,可以基于boost和std的现有字符串算法实现。

你可能感兴趣的:(GB28181,GB28181协议,GB28181)