::recv(*pReceiveMframe->m_pClientSocket, bufTemp, BUFFLENGTH, 0);如上语句,如果我发现了bufTemp中的数据是我要接收的,那么,我怎么样去接收下条信息呢?
关于缓冲如何设置????
关于缓冲如何设置????
解决方案 »
- 求助:刚才闪了下机,程序无法运行,要崩溃了。
- Nero SDK问题
- windows串口读的问题
- 用VC创建一个新的xml文件时,1。怎样设置才能使encoding是gb2312,2。每个节点一行且自动缩进(像树型一样)
- 再搞不定我要自杀啦。。。。。。。
- 关于CMap的问题,总有错误,请知道的兄弟进来看看!
- 菜鸟问题:我建立一个单文档,选择的是formview,里面如果响应那个对话框的消息呢?就是一开始的那个对话框
- 在win200下如何控制关机呢??高手们帮帮我呀
- 接收串口16进制数据设置计算机时间,急!!!!!!!!!!
- 请大家帮帮我(CListCtrl的问题)!
- 苦思几日,但也不明白怎样才能做出像 Word、Excel 这样的界面。从哪里可以找到这样的书或资料 ?
- 按住键盘的某个键不放,如何只让它发出一个WM_KEYDOWN消息?
有数据到的话会执行OnReceive()事件,在这个函数里接收数据。每次有数据到时都会执行这个函数。
如是异步,可以先得到它的缓冲区数据长度,再接收:
int Len;
ioctlsocket(s, FIONREAD, &len);
char buffer[] = new char[len];
recv(s, buffer, len, 0);
/* or
while (len > 0)
{
int ret = recv(s, buffer, BUFFERLEN, 0);
len -= ret;
// proc buffer;
}
*/
...如果是阻塞嘛,最好发数据前,发个数据长度,再发数据。
接收时,先接收数据的长度,然后一点点收啦。一般来说在异步中,如果一方连继发送多个data,而接收方ioctlsocket是
根据缓冲区来判断长度,所以建议你:发送前,先发个data len给一端,而
另一端先接收len,再根据它来接收对应长度的data
{
//获取CMainFrame类的指针
CMainFrame* pReceiveMframe = (CMainFrame*)pParam;
UINT nReceiveMessLength = 0;
//定义信息接收缓冲
char bufTemp[BUFF_LENGTH];
unsigned int bufEmptyLen = BUFF_LENGTH;
CString strReceive, strTemp;
//循环检测信息接收缓冲,有信息则接收
while (m_gbThreadRun)
{
//接收信息
nReceiveMessLength = ::recv(*pReceiveMframe->m_pClientSocket, bufTemp
+ (BUFF_LENGTH - bufEmptyLen), bufEmptyLen, 0); //判断是否接收到信息,接收到,则分析
if (nReceiveMessLength < 0 || nReceiveMessLength > bufEmptyLen)
{
Sleep(100);
continue;
}
else
{
// 判断是否是命令的开头 去掉头部空格
strTemp.Format("%s", bufTemp);
while (TRUE)
{
CString str;
if (strTemp.Left(1) == " ")
{
str.Format("%s", strTemp.Mid(1));
strTemp.Empty();
strTemp.Format("%s", str);
bufEmptyLen += 1;
}
else
{
break;
}
}
int len = (UINT)StringToInt(strTemp.Left(4));
if (len > 0 )
{
m_gstrReceiveBuff.AddHead(strTemp.Left(len));
strcpy(bufTemp, strTemp.Mid(len));
// 重新设置缓冲的空闲大小
bufEmptyLen -= nReceiveMessLength;
bufEmptyLen += len;
}
}
Sleep(100);
}
return 0;
}