通过socket发送的数据怎么在发送的每帧数据前都加上统一的头比如:0xe4,0x1b,0x92,0x47

枕戈待旦勇往直前 2013-01-04 08:49:24
好的,谢谢。
通过recv()函数接收客户端传过来的数据,每次都要从接收的数据中查找同步头

while(……)
{

countReceivd=recv(m_sConnectSocket[gSocketNum], buffRevTemp,m_pNetPara[gSocketNum]->GetRecBuffSize(), 0);

totalReceived += countReceivd; //totalReceived、countReceivd初值都为0

// 找同步头
if(memcmp(netHead, buffRevTemp, headLength) != 0)
{
headIndex = searchNetHead(buffRevTemp, totalReceived,netHead,headLength);
if(headIndex == -1)
{
totalReceived = 0;
continue;
}
else
{
flagGetSize = true;
}
}
else
{
flagGetSize = true;
}
……
}
同步头的定义为:
char netHead[4] = {0xe4,0x1b,0x92,0x47};

请问:
我在客户端发送的时候是将图片读入内存通过send函数来发送图像数据的

send(sockClient, sendBuffer, sizeof(bInfo), 0); //传输bmp图片的信息头
send(sockClient,(char*)pBmpBuf,bInfo.lineByte*bInfo.bmpHeight,0);

怎么才能在发送的每帧数据上都加上同步头0xe4,0x1b,0x92,0x47 呢?
感觉通过
send(sockClient, "0xe4,0x1b,0x92,0x47", strlen("0xe4,0x1b,0x92,0x47")+1, 0);不对,这样就是发送的字符串了?
...全文
855 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
tp机器猫 2013-01-08
  • 打赏
  • 举报
回复
我听说TCP协议不是可以保证数据正确性吗?
  • 打赏
  • 举报
回复
接收数据端的代码如下:

__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)
但接收时辅助数据显示正常,图片却是黑色的


  • 打赏
  • 举报
回复
引用 4 楼 Squall_zy 的回复:
我写一段伪代码,你自己改造一下吧: char SendBuf[1024*1024*5]; //如果开不出来,你就new一下吧。 int nSize = 0; char netHead[4] = {0xe4,0x1b,0x92,0x47}; memcpy( SendBuf, netHead, 4 ); nSize += 4; memcpy( SendBuf+nSize, &am……
谢谢,很受用,谢谢
  • 打赏
  • 举报
回复
引用 6 楼 fghydx 的回复:
加同步头干什么?有什么用?
加同步头是为了检测帧接收的正确性
tp机器猫 2013-01-05
  • 打赏
  • 举报
回复
加同步头干什么?有什么用?
西山小月 2013-01-04
  • 打赏
  • 举报
回复
直接字符串比较就可以了
Squall_zy 2013-01-04
  • 打赏
  • 举报
回复
我写一段伪代码,你自己改造一下吧: char SendBuf[1024*1024*5]; //如果开不出来,你就new一下吧。 int nSize = 0; char netHead[4] = {0xe4,0x1b,0x92,0x47}; memcpy( SendBuf, netHead, 4 ); nSize += 4; memcpy( SendBuf+nSize, &bInfo, sizeof(bInfo) ); nSize += sizeof(bInfo); memcpy( SendBuf+nSize, pBmpBuf, bInfo.lineByte*bInfo.bmpHeight ); nSize += bInfo.lineByte*bInfo.bmpHeight; send(sockClient, SendBuf, nSize, 0);
  • 打赏
  • 举报
回复
引用 1 楼 Squall_zy 的回复:
你代码里不是已经有答案了么? char netHead[4] = {0xe4,0x1b,0x92,0x47}; send(sockClient, netHead, 4, 0); 但建议你将头部组合到大报文里一起发送,效率会高些。netHead不要单独send一次,太浪费。
头部组合到大报文里一起发送,是通过memcpy()函数将netHead所在的内存区域复制到报文的内存区域吗?
  • 打赏
  • 举报
回复
//发送代码部分如下: char sendBuffer[100]; memcpy(sendBuffer,&bInfo,sizeof(bInfo)); send(sockClient, sendBuffer, sizeof(bInfo), 0); //传输bmp图片的信息头 send(sockClient,(char*)pBmpBuf,bInfo.lineByte*bInfo.bmpHeight,0); 我想在发送的每帧数据里都包含同步头:0xe4,0x1b,0x92,0x47,应该怎么写呢? 是不是应该用for循环?如: int m=0,n=0; int num=bInfo.lineByte*bInfo.bmpHeight/1024; for(m=0;m<num;m+=1024) //传输bmp图像数据 { n=send(sockClient,buff+m,1024,0); if(n==-1) perror("send error"); printf("n:%d\n",n); } 求详细写法?
Squall_zy 2013-01-04
  • 打赏
  • 举报
回复
你代码里不是已经有答案了么? char netHead[4] = {0xe4,0x1b,0x92,0x47}; send(sockClient, netHead, 4, 0); 但建议你将头部组合到大报文里一起发送,效率会高些。netHead不要单独send一次,太浪费。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧