我要调用recv函数接收一个不定长的数据包,一次调用recv可能会收到几个数据包,也可能要调几次才能收完一个数据包,整个数据包长度由前两个字节指示。我想先把这两个字节取出来,然后根据它的值分配buffer,再去取消息体,请问如何实现?我又如何才能知道一次recv的从网络上接收了多少个字节的数据呢?请各位达人不吝赐教。
解决方案 »
- 又是一个MFC送分贴
- 背景窗口刷新不对,帮忙看看!
- 静态的lib 和 动态的lib 不可以混用在一个程序中?!!!
- 请问一下pdflib如何加载?
- 怎样在重绘屏幕时防止闪烁?
- C++中的运算符成员函数 与 C 中的运算符的 区别?
- 在vc6.0中如何实现在窗口中插入背景图片?
- ■■■■在win98下怎么隐藏进程?注册系统服务吗,怎么用?谢谢■■■■
- 求助:VC:在线程中发送构建SOAP消息并发送,程序执行后出错
- 基于对话框的程序中,使用了Tree Control和Edit box,如何在Edit box中显示TreeControl中选中的文本文件的内容。希望提供类似的例子。
- 连接文件路径和文件名字符串出现的问题!
- 如何判断一个文件已经被打开?
unsigned char *m_buf=NULL;
SOCKET sclient;
struct sockaddr_in server;
while(1) //这个循环用于连接服务器
{
if(connect(sclient,(struct sockaddr *)&server,sizeof(server))<0)
{
AfxMessageBox("连接失败,请检查网络!");
//continue;
break;
}
while(1) //这个循环用于接收服务器发送的数据
{ char Length[2];
ret=recv(sclient,(char *)Length,2,0); //接收数据长度
if(ret)
{
ret=Length[0];
ret=ret<<8|Length[1]; //拼接长度
m_buf=(BYTE *)new char[ret];
}
else
AfxMessageBox("数据接收失败,请检查网络或重启程序!");
while(1)//这个循环用于接收服务器发送的图像,存盘
{
pklen=0;
FileLength=0;
pklen=recv(sclient,(char *)m_buf,ret,0);
if(pklen<=0)
{
AfxMessageBox("数据接收失败,请检查网络或重启程序!");
break;
//continue;
}
FileLength+=pklen;
if(FileLength==ret) break;
}
}
break;
}