最近項(xiàng)目上使用Socket接收單邊機(jī)傳送過來的h264裸流葛圃,這個(gè)小小的需求結(jié)果得花非常多的時(shí)間測(cè)試其穩(wěn)定性。以下是在開發(fā)過程中解決的一點(diǎn)心得袁滥。
信號(hào)
使用bsd sockets得需要注意處理SIGPIPE信號(hào),這是一個(gè)不可恢復(fù)的系統(tǒng)信號(hào),如果不做處理程序會(huì)直接crash自晰。而我們需要給用戶一個(gè)友好的提示自定義協(xié)議
h264數(shù)據(jù)是一個(gè)連續(xù)的IO流,所以雙方都需定義一個(gè)協(xié)議指導(dǎo)客戶端如果接收數(shù)據(jù)稍坯。協(xié)議包含frame的大小, i/p 的標(biāo)記位等等業(yè)務(wù)相關(guān)信息酬荞。
在實(shí)際測(cè)試途中,協(xié)議頭并沒有如愿接收正確的數(shù)據(jù)瞧哟。比如期望的結(jié)果是 01 07 09 10, 但是客戶端收到的是 01 00 00 00 ,后面的數(shù)據(jù)都被置0了, 造成接收幀數(shù)據(jù)的時(shí)候?qū)R錯(cuò)誤混巧。
最后的解決辦法就是盡量精簡(jiǎn)協(xié)議頭長(zhǎng)度,只保留幀長(zhǎng)度等關(guān)鍵信息勤揩。另外咧党,在獲取幀數(shù)據(jù)的時(shí)候查找 h264 00 00 00 01 的分隔符。盡量保證數(shù)據(jù)的穩(wěn)定性陨亡。超時(shí)
使用socket一個(gè)不穩(wěn)定的地方就是傍衡,如果單邊機(jī)出現(xiàn)一些不可預(yù)測(cè)是耗時(shí)操作影響發(fā)送速度深员,recv會(huì)長(zhǎng)時(shí)間的阻塞。這時(shí)就留下一個(gè)難題蛙埂,是設(shè)置足夠長(zhǎng)的時(shí)間等待還是規(guī)定時(shí)間關(guān)閉連接辨液。給方便權(quán)衡之下選擇使用默認(rèn)超時(shí)。給socket一個(gè)‘復(fù)活’的機(jī)會(huì)