我利用CSocket发送了一段消息,以“M”开头,然后发有效数据,最后发结束符“N”。
接收函数为
int CTestDlg::ReceiveFileMsg(CSocket &recSo, SOCKADDR_IN &client)
{
m_Output.ResetContent();
if(m_type=='M') //在监听线程里我已经判断了消息头
{
char buff[100]={0};
CString msg;
int ret=0;
for(;;)
{
ret=recSo.Receive(buff,100);
if(ret==0)
break;
msg+=buff;
}
CString strOut,strIn;
m_You_IP.GetWindowText(strIn);
GetNamebyAddress(strIn,strOut);
CString youName;
youName.Format(inet_ntoa(client.sin_addr));
CString str=youName+"<-"+strOut;
AddMsgList(str,msg);
Strtok(msg);
}
recSo.Close();
return 0;
}
因为有的时候数据量很大,远远大于100个字符,所以得设置个循环,同时我加了个结束符,现在的问题是怎么写这个循环,判断条件是最后一个字符“N”????
接收函数为
int CTestDlg::ReceiveFileMsg(CSocket &recSo, SOCKADDR_IN &client)
{
m_Output.ResetContent();
if(m_type=='M') //在监听线程里我已经判断了消息头
{
char buff[100]={0};
CString msg;
int ret=0;
for(;;)
{
ret=recSo.Receive(buff,100);
if(ret==0)
break;
msg+=buff;
}
CString strOut,strIn;
m_You_IP.GetWindowText(strIn);
GetNamebyAddress(strIn,strOut);
CString youName;
youName.Format(inet_ntoa(client.sin_addr));
CString str=youName+"<-"+strOut;
AddMsgList(str,msg);
Strtok(msg);
}
recSo.Close();
return 0;
}
因为有的时候数据量很大,远远大于100个字符,所以得设置个循环,同时我加了个结束符,现在的问题是怎么写这个循环,判断条件是最后一个字符“N”????
解决方案 »
- VC9中“新建工程”界面如何实现?
- gif文件的解码问题
- ado 设置了连接超时时间,结果无效怎么回事?
- dataGrid中:OnRowColChange怎么获得当前行的值?谢谢!!!
- connect的返回错误码不是只有msdn中列出的错误值,这该怎么处理这样的情况
- 子函数怎么返回CStdioFile类型得值
- FindFirstFile()得到的结果中的文件是按什么顺序得到的?时间?大小?
- 请教各位大侠:如何让listctrl中的缩略图一个一个的显示出来呀?且不让窗口闪烁?
- 请问怎样才能在一个对话框中添加属性表和dbgrid控件?
- 为什么计算机书籍都这么贵呀(真是郁闷~!)
- 收到几封CSDN的广告邮件,有地方设置不收这些邮件吗?
- 如何设置CListCtrl中的值.
{
char buf[MAX];
int nRet=recv(hSocket,buf,MAX,0); if(strcmp(buf[0],'!')==0) //接收到的第1个字符为'!';
if(strcmp(buf[nRet-1],'#')==0) //接收到的最后一个字符为'#'号
}最好不要 m n 这样的字符 要用特殊点的 比如上面的 ! # 号等
所以你可以自己定义自己的协议啊,比如第一个字节是一个标示位,第二个是这个包的长度
你先recv第一个字节,看看是不是你的包,如果是,你再recv一个字节,看看是不是你定义的长度,如果是,那就recv这个长度的字节...
-----------------------
那样就是包粘住了 这样包不完整的可能就2种(不完整指收到的包的内容与实际发送的包的内容大了 或小了 )
1:粘包(A:发送端由于发送数据时数据量太小 B:接收端由于接收的时候系统繁忙 导致FD_READ事件被阻碍 这样包也粘住了)
2:如果发送端发送的包大过系统最大允许的大小 那么系统帮你分包 1包变N包
或缓冲区塞满了(接收端跟发送端都有可能)
上面的问题几个语句就可以解决 为什么不能用起始结束字符
你去翻翻传奇的代码 人家就那样干的 难道写传奇协议的人会差劲到这个地步??
你从单个线程的角度考虑,大量的数据包到达时:
第一你的CPU性能的利用率会高上几十倍;第二至少你不需要为这些数据包准备对应的缓存当然,实际上情况不能理解的这么简单,单通常来说
你的计算能力绰绰有余的时候,比较多考虑帧长度的办法
计算能力捉襟见肘的时候,那就考虑边界的办法吧