功能介绍:
要实现的功能是由一个嵌入式系统到PC机通过网络进行实时图像的传输。一帧图像大小为300多K。嵌入式系统上运行的是linux操作系统,PC上我使用MFC中提供的CSocket和CAsyncSocket类进行编程。遇到的问题:
可以实现实时的传输,也可以显示出来。不过程序有些不稳定。时不时的PC端的客户端会“没有响应”,有时可以传上万帧,有时只传几十帧就出现这个问题。经过调试发现是socket通信上的问题。希望高手能够给我一些帮助。
CAsyncSocket::IOCtl(FIONREAD,nBufDataSize);
TRACE("There are %u Data in the buffer.\n",*nBufDataSize);
// int nResult = CAsyncSocket::Receive(pTemp,m_nImageBytesSize * 2 / 3,0);
if(*nBufDataSize != 0)
{
int nResult = CAsyncSocket::Receive(pTemp,*nBufDataSize,0);
}
delete nBufDataSize;
TRACE("Get Data %d this time\n",nResult);
调试时在上面这段代码中出现问题:
    在程序没有响应的时候,程序停在了int nResult = CAsyncSocket::Receive(pTemp, *nBufDataSize, 0);这句话,可是这个时候CAsyncSocket::IOCtl(FIONREAD,nBufDataSize);得到缓冲区中还是有数据。部分代码:
linux端服务器:
char* pData = new char[656*490];
int nLeft = 656*490;
char* pReceive = new char[10];
int nTemp = 0;
while(nLeft > 0)
{
     nTemp = send(fd,pData,nLeft,0);
     if(nTemp < 0)  
     {
        perror("");
        exit();
     }
     nLeft -= nTemp;
     pData += cnt;  
}if(收到客户端的继续请求)
    继续发送下一帧
else
    停止delete[] pData;
delete[] pReceive;  PC客户端:
while(TRUE)
{
BYTE* pTemp = m_pImgBuffer + m_nHaveReceiveBytes;
DWORD* nBufDataSize = new DWORD; CAsyncSocket::IOCtl(FIONREAD,nBufDataSize);
TRACE("There are %u Data in the buffer.\n",*nBufDataSize);
// int nResult = CAsyncSocket::Receive(pTemp,m_nImageBytesSize * 2 / 3,0);
if(*nBufDataSize != 0)
{
int nResult = CAsyncSocket::Receive(pTemp,*nBufDataSize,0);
}
delete nBufDataSize;
TRACE("Get Data %d this time\n",nResult);
if(nResult < 0)
{
if(GetLastError() == WSAEWOULDBLOCK)
{
TRACE("ERROR");
break;
}
else
{
TRACE("Error when receive image data from server!%d",GetLastError());
Close();
return;
}
}
else
{
m_nHaveReceiveBytes += nResult;
if(m_nHaveReceiveBytes == 一帧图像大小)
{
m_bComplete = TRUE;
m_nHaveReceiveBytes = 0;
break;
}
}
Sleep(10);
} if(m_bComplete)
{
                  显示图像; m_nRecvBmpSum ++; if(m_bConnect)  //是否继续发送下一帧
CSocket::Send("CONTINUE",8,0);
else
{
CSocket::Send("END",3,0);
delete pMainFrame->m_oClientSocket;
}
}

解决方案 »

  1.   

    m_pImgBuffer 这个缓冲足够大么?
      

  2.   

    回复weiziyuner:
        我设置的m_pImgBuffer是一帧图像的大小。300多K
      

  3.   

    pTemp + *nBufDataSize // 内存越界了,有可能,你可以调试的时候看看是不是.
    --
    m_pImgBuffer 里面有多少的内存,然后看看pTemp之前用掉了多少,就可以知道你分配的内存够不够了.
    --
    以前碰到过这种半死不活的问题,我记得问题是Reiceive访问内存越界了,你可以尝试看看.
      

  4.   

    To chen_jun_fen :
       我目前采集的是灰度图,每个象素由一个字节来表示。所以图像数据大小是固定的。我调试的时候在服务器端输出每次send的数据的字节数。都是固定的。
    To weiziyuner:
       这个应该是没有问题的吧。因为我调试的时候TRACE输出了这些值,都是没有问题的。并且我这个程序不稳定,传递几百上千上万帧图像有时没有问题,有时程序就没有响应了。每次停的地方都不一样。
      

  5.   

    每次停的地方都不一样。
    --
    什么意思,你不是说阻塞在CAsyncSocket::Receive(pTemp,*nBufDataSize,0);么??
      

  6.   

    To weiyiyuner:
       我是实时传输图像,有时传递100帧图像出问题,有时传递几千帧出问题,有时传递上万帧才出问题。这个不一样。但是基本上每次都是卡在receive这个地方。
      

  7.   

    To weiyiyuner:
       我的程序里面
     m_pImgBuffer = new BYTE[m_nImageBytesSize];
     
     BYTE* pTemp = m_pImgBuffer + m_nHaveReceiveBytes; nResult = CAsyncSocket::Receive(pTemp,m_nImageBytesSize - m_nHaveReceiveBytes,0);
    这样应该不会内存越界吧:)还请多多指教。我都快疯了^_^