首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

socket接收图像数据代码的理解有关问题,求多多指点

2013-01-26 
socket接收图像数据代码的理解问题,求多多指点接收数据端的代码如下:__int64 blockSize 0char *buffRev

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接收图像数据代码的理解有关问题,求多多指点 socket? 帧同步,同步头
[解决办法]


__int64 blockSize;
memcpy( &blockSize, buffRevTemp+4, sizeof(__int64) );


如果不行,把发送端的代码改成同上的形式。

[解决办法]
有没有结构对齐 问题?
[解决办法]
引用:
引用:协议int64 是不是有问题?

 我如果改成int32即:
blockSize = ((__int32 *)(buffRevTemp+headLength))[0];
则测出来blockSize=0

即: QV_FrameHead qv_FrameHead;
 qv_FrameHead.Head = ……
一个字节一个字节对一下
我觉得传输不可能出去问题

热点排行