socket接收图像数据代码的理解问题,求多多指点
接收数据端的代码如下:
__int64 blockSize = 0;
char *buffRevTemp;
buffRevTemp=new char[m_pNetPara[gSocketNum]->GetRecBuffSize()]; //大小为10M
buffRevTemp2=new char[m_pNetPara[gSocketNum]->GetRecBuffSize()];
int countReceivd=0,totalReceived=0;
while(m_bConnectedFlag[gSocketNum] == true && m_bRun == true)
{
countReceivd=recv(m_sConnectSocket[gSocketNum], buffRevTemp+totalReceived,
m_pNetPara[gSocketNum]->GetRecBuffSize()-totalReceived, 0);
if(countReceivd==0 ||countReceivd==SOCKET_ERROR || m_bRun == false)
{
m_bConnectedFlag[gSocketNum] = FALSE; //连接标志位置FALSE
delete[] buffRevTemp; /释放接收缓冲区
}
totalReceived += countReceivd;
// block size:
if( totalReceived >= headLength+sizeLength && flagGetSize == false)
{
// 找同步头
if(memcmp(netHead, buffRevTemp, headLength) ==0) //找到同步头
{
blockSize = ((__int64 *)(buffRevTemp+headLength))[0];
frameLength = (( int*)(buffRevTemp+20))[0];
m_pShowDataPara[gSocketNum]->m_nImageWidth = frameLength;
if(totalReceived >= blockSize + lenlen && flagGetSize == true)
{
// 拷贝数据
memcpy(m_pShowDataPara[gSocketNum]->m_pImageBuff,buffRevTemplenlenblockSize); //lenlen=12,其中前4个字节为同步头m_pShowDataPara[gSocketNum]->m_nImageHeight = blockSize/frameLength//数据高度 SetEvent(m_pShowDataPara[gSocketNum]->m_pImageBuffEvent);
}
if(totalReceived > blockSize + lenlen)
{
memcpy(buffRevTemp2,buffRevTemp+blockSize+lenlen,totalReceived-blockSize-lenlen);
memcpy(buffRevTemp,buffRevTemp2,totalReceived-blockSize-lenlen);
}
totalReceived=totalReceived-blockSize-lenlen;
countReceivd=0;
blockSize = 0;
flagGetSize = false;
} //while(m_bConnectedFlag[gSocketNum] == TRUE)
问题如下:
1、 blockSize = ((__int64 *)(buffRevTemp+headLength))[0];//
该语句是将存储接收到的数据地址偏移headLength(为4)个字节后取8个字节的长度,断点测试值为
4294967407=4G,传送时前4个字节为同步头char netHead[4] = {0xe4,0x1b,0x92,0x47};
接下来就是帧头qv_FrameHead大小为100字节。那blockSize怎么取的值为4G呢?
2、countReceivd=recv(m_sConnectSocket[gSocketNum], buffRevTemp+totalReceived,
m_pNetPara[gSocketNum]->GetRecBuffSize()-totalReceived, 0);
该语句是表明在socket连接正常时while循环接收的数据大小为m_pNetPara[gSocketNum]->GetRecBuffSize()//即10M,理解正确吗?
3、memcpy(m_pShowDataPara[gSocketNum]->m_pImageBuff,buffRevTemp+lenlen,blockSize);//lenlen=12,其中前4个字节为同步头
该句将大小为blockSize的图像数据复制到m_pImageBuff,触发显示图像方法。但是blockSize前面测了为4G,我传输时测试用的bmp图片仅为几百k,所以我将blockSize=145404;//其中145200为图片的lineByte*bmpHeight, +同步头(4)+帧头(100)+辅助数据(80)
但接收时辅助数据显示正常,图片却是黑色的
socket? 帧同步,同步头
[解决办法]
__int64 blockSize;
memcpy( &blockSize, buffRevTemp+4, sizeof(__int64) );
如果不行,把发送端的代码改成同上的形式。
[解决办法]
有没有结构对齐 问题?
[解决办法]
一个字节一个字节对一下
我觉得传输不可能出去问题