首先,如果是SIP協議服務端的話,不建議使用eXosip庫,性能太差了。建議基於osipparser2實現SIP協議解析,自己實現TCP和UDP通信。對於TCP通信來說,一個完整SIP消息可能是分多次異步接收的,需要自己實現粘包。因爲osipparser2解析SIP協議是必須輸入一個完整的SIP消息。
SIP協議的格式主要有兩種表現形式:僅有SIP消息頭(SDP消息長度爲0),SIP消息頭+SDP消息體。
SIP協議無SDP的SIP消息格式:
SIP協議有SDP的SIP消息格式:
粘包的關鍵就在於SIP頭尾部的CRLF(\r\n\r\n),然後就是通過"Content-Length:"得到SDP的長度。
注意,字符轉數字時要兼容的是數字前的空格。
另外,在斷包之前,需要將字符串左側的\r、\n和空格清理掉,可以基於boost和std的現有字符串算法實現。