视频监控安防平台-GB28181-2016版-sip协议tcp沾包流程

                 视频监控安防平台-GB28181-2016版-sip协议tcp沾包流程

      由于GB28181设计的时候基本很少使用tcp包,只有在资源推送和录像检索查询返回的时候才会使用的tcp消息,下面简单说一下tcp消息使用,首先建立一个tcp短连接,然后将消息发送出去,消息长度尽量在2M以下。

下面粘贴一段sip消息tcp沾包的代码,希望对您有所帮助.

void CUvSocketTransMgr::sip_tcp_sticky_packet(TUvSocketItem * pSocketItem, const char *pData, int len, const char *pSrcIP, int SrcPort,const char* pDestIP,int DestPort)
{
	if(len > 0)
	{
		char *end_sip = NULL;
		char *cl_header = NULL;
		int cl_size = 0;
		
		if(pSocketItem->pTcpRecvData != NULL)
		{
			/* concat old data with new data */
			pSocketItem->pTcpRecvData = (char *)realloc(pSocketItem->pTcpRecvData, pSocketItem->nTcpRecvLen+len+1);
			if(NULL == pSocketItem->pTcpRecvData)
			{
				printf("realloc pTcpRecvData failed!\n");
				pSocketItem->nTcpRecvLen = 0;
				return;
			}
			strncpy(pSocketItem->pTcpRecvData+pSocketItem->nTcpRecvLen, pData, len);
			pSocketItem->pTcpRecvData[pSocketItem->nTcpRecvLen+len] = '\0';
			pSocketItem->nTcpRecvLen = pSocketItem->nTcpRecvLen + len;
		}
		if(NULL == pSocketItem->pTcpRecvData)
		{
			pSocketItem->pTcpRecvData = (char *)malloc(len+1);
			if(pSocketItem->pTcpRecvData != NULL)
			{
				memset(pSocketItem->pTcpRecvData, 0, len+1); 
			}
			strncpy(pSocketItem->pTcpRecvData, pData, len);
			pSocketItem->pTcpRecvData[len] = '\0';	
			pSocketItem->nTcpRecvLen = len;
		}
		end_sip = strstr(pSocketItem->pTcpRecvData, "\r\n\r\n");
		while(end_sip != NULL)
		{
			cl_header = mystrcasestr(pSocketItem->pTcpRecvData, "\ncontent-length ");
			if (cl_header == NULL || cl_header > end_sip)
				cl_header = mystrcasestr(pSocketItem->pTcpRecvData,"\ncontent-length:");
			if (cl_header == NULL || cl_header > end_sip)
				cl_header =mystrcasestr(pSocketItem->pTcpRecvData,"\r\nl ");
			if (cl_header == NULL || cl_header > end_sip)
				cl_header =mystrcasestr(pSocketItem->pTcpRecvData,"\r\nl:");

			if (cl_header != NULL && cl_header < end_sip)
				cl_header = strchr(cl_header, ':');
			if (cl_header == NULL || cl_header >= end_sip) 
			{
					/* remove data up to crlfcrlf and restart */
				memmove(pSocketItem->pTcpRecvData, end_sip+4,pSocketItem->nTcpRecvLen -(end_sip + 4 -pSocketItem->pTcpRecvData) + 1);
				pSocketItem->nTcpRecvLen = pSocketItem->nTcpRecvLen - (end_sip +4 -pSocketItem->pTcpRecvData);

				pSocketItem->pTcpRecvData = (char *)realloc(pSocketItem->pTcpRecvData, pSocketItem->nTcpRecvLen+1);

				if(pSocketItem->pTcpRecvData == NULL)
				{
					pSocketItem->nTcpRecvLen = 0;
					break;
				}
				end_sip =strstr(pSocketItem->pTcpRecvData,"\r\n\r\n");
				continue;	/* and restart from new CRLFCRLF */
			}
			/* header content-length was found before CRLFCRLF -> all headers are available */
			cl_header++;	/* after ':' char */
			cl_size = atoi(cl_header);
			if (cl_size == 0|| (cl_size >0 && (end_sip + 4 + cl_size <=pSocketItem->pTcpRecvData+pSocketItem->nTcpRecvLen)))
			{
				uv_mutex_lock(&mutex_data_);
				RecvPacketCallBack(pSocketItem->socketfd,pSocketItem->pTcpRecvData, (end_sip + 4 + cl_size -pSocketItem->pTcpRecvData),\
					pSrcIP,SrcPort,pDestIP,DestPort, true);	
				uv_mutex_unlock(&mutex_data_);
				
				if (pSocketItem->nTcpRecvLen -(end_sip + 4 + cl_size -pSocketItem->pTcpRecvData) == 0) 
				{
					end_sip = NULL;
					pSocketItem->nTcpRecvLen = 0;
					free(pSocketItem->pTcpRecvData);
					pSocketItem->pTcpRecvData = NULL;
					continue;
				}

				memmove(pSocketItem->pTcpRecvData,end_sip + 4 + cl_size, pSocketItem->nTcpRecvLen -(end_sip + 4 + cl_size -pSocketItem->pTcpRecvData) + 1);
				pSocketItem->nTcpRecvLen = pSocketItem->nTcpRecvLen - (end_sip +4 +cl_size -pSocketItem->pTcpRecvData);

				pSocketItem->pTcpRecvData = (char *)realloc(pSocketItem->pTcpRecvData,pSocketItem->nTcpRecvLen + 1);
				if (pSocketItem->pTcpRecvData == NULL)
				{
					printf("realloc  pSocketItem->pTcpRecvDatapSocketItem->pTcpRecvDatapSocketItem->pTcpRecvData!!\n");
					pSocketItem->nTcpRecvLen = 0;
					break;
				}
				end_sip =strstr(pSocketItem->pTcpRecvData,"\r\n\r\n");
				continue;	/* and restart from new CRLFCRLF */
						
			}
			/* uncomplete SIP message */
			end_sip = NULL;		
		}
		if (pSocketItem->nTcpRecvLen== 0) 
		{
			/* all data consumed are reallocation error ? */
			return;
		}
	}
	else if(len< 0)
	{
		printf("Could not read socket (%d)- close it\n",pSocketItem->socketfd);
		//DelSocketItem(pSocketItem);
		//close(pSocketItem->sock);
	}
	else if (len == 0)
	{
		printf("End of stream (read 0 byte from %s:%i)\n", pSocketItem->srcip, pSocketItem->srcport);
		//DelSocketItem(pSocketItem);
		//close(pSocketItem->sock);
	}
	else
	{
		printf("Dummy SIP message received (size=%d)\n", len);
	}

}

目前多个项目对接暂时未发现问题,可以放心使用。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值