本人在做一个视频传输的程序,目的是将客户端jpeg格式的视频发送到服务器端。发送的过程如下:
1、客户端取得一帧图像的大小,将大小数据(int型,占4 byte)发送到服务器端。
2、在发送图像大小后开始发送图像数据。
采用的是阻塞式的发送与接收,没有标记帧头与帧尾,发送端只管按照发送的过程发送,接收端按照相应的过程接收,一帧发完延迟一会发下一帧。
发送代码片段如下:#define BUF_LENS 2048
……
send(slisten, &iJpegSize , sizeof(&iJpegSize ), 0);//获得图像大小
while(1)
{
iSend = send(slisten, JpegBuf + iSendCnt , BUF_LENS, 0);
Sleep(1);
iSendCnt += iSend;
if(iSendCnt == iJpegSize)//发送完成
{
break;
}
……
}接收代码片段如下:#define BUF_LENS 2048
while(1)
{
iRecv = recv(slisten, buffer , BUF_LENS, 0);
if(!m_IsGetSize)
{
iJpegSize = GetJpegSize(buffer);//由char转换得到int的图像大小数据
m_IsGetSize = TRUE;
}
else
{
iRecvCnt += iRecv;
if(iRecvCnt == iJpegSize)
{
break;
}
}
}测试结果:大部分时候发送接收都没问题,能够正常接收图像大小和数据。但是有时候接收不到图像的大小,导致程序崩溃。在一番测试调查后发现正常情况下第一个接收的iRecv的值是等于4的(也就是一个int的大小,即send(slisten, &iJpegSize , sizeof(&iJpegSize ), 0); 这段程序发送的数据,存储了图像大小的数据),但是在程序崩溃的情况下第一个接收的iRecv的值不是等于4,
而是等于2048(即iSend = send(slisten, JpegBuf + iSendCnt , BUF_LENS, 0); 这段代码发的数据),在这种情况下iRecv等于4的会被延后,可能是第3个,也可能是第10个。我的疑惑就是TCP不是顺序接收数据的吗?为什么会出现先发的socket后到,后发的先到的情况?而且按理来说网络发送会出现合并包、分包的情况,就是4 byte的数据很可能会和后面的数据合并成一个包一起发送,但是我这里却还是会收到4 byte这个数据包,有高手能够解释下吗?谢谢
1、客户端取得一帧图像的大小,将大小数据(int型,占4 byte)发送到服务器端。
2、在发送图像大小后开始发送图像数据。
采用的是阻塞式的发送与接收,没有标记帧头与帧尾,发送端只管按照发送的过程发送,接收端按照相应的过程接收,一帧发完延迟一会发下一帧。
发送代码片段如下:#define BUF_LENS 2048
……
send(slisten, &iJpegSize , sizeof(&iJpegSize ), 0);//获得图像大小
while(1)
{
iSend = send(slisten, JpegBuf + iSendCnt , BUF_LENS, 0);
Sleep(1);
iSendCnt += iSend;
if(iSendCnt == iJpegSize)//发送完成
{
break;
}
……
}接收代码片段如下:#define BUF_LENS 2048
while(1)
{
iRecv = recv(slisten, buffer , BUF_LENS, 0);
if(!m_IsGetSize)
{
iJpegSize = GetJpegSize(buffer);//由char转换得到int的图像大小数据
m_IsGetSize = TRUE;
}
else
{
iRecvCnt += iRecv;
if(iRecvCnt == iJpegSize)
{
break;
}
}
}测试结果:大部分时候发送接收都没问题,能够正常接收图像大小和数据。但是有时候接收不到图像的大小,导致程序崩溃。在一番测试调查后发现正常情况下第一个接收的iRecv的值是等于4的(也就是一个int的大小,即send(slisten, &iJpegSize , sizeof(&iJpegSize ), 0); 这段程序发送的数据,存储了图像大小的数据),但是在程序崩溃的情况下第一个接收的iRecv的值不是等于4,
而是等于2048(即iSend = send(slisten, JpegBuf + iSendCnt , BUF_LENS, 0); 这段代码发的数据),在这种情况下iRecv等于4的会被延后,可能是第3个,也可能是第10个。我的疑惑就是TCP不是顺序接收数据的吗?为什么会出现先发的socket后到,后发的先到的情况?而且按理来说网络发送会出现合并包、分包的情况,就是4 byte的数据很可能会和后面的数据合并成一个包一起发送,但是我这里却还是会收到4 byte这个数据包,有高手能够解释下吗?谢谢
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货