我在做一个测试,只有两台机器通信,客户端上有两个相同进程不停的连接服务器,服务器从数据库中提取数据,然后发回客户端但是长时间的测试发现,偶尔有几次客户端收到的数据和服务器发出的数据不一致
每次的数据长度大约有200k,由于每次传输的数据都是相同的,而且我是用XML的格式,客户端解析失败,证明数据不准确
why?
每次的数据长度大约有200k,由于每次传输的数据都是相同的,而且我是用XML的格式,客户端解析失败,证明数据不准确
why?
解决方案 »
- MFC中使用Tab控件切换视图页面出现问题
- CMFCOutlookBar如何固定大小?CBRS_SIZE_FIXED没用
- CMenu::DrawItem中关于ODS_SELECTED状态的一个小问题
- 关于VC导入图片和显示数字的问题
- ShellExecute的参数问题,谢谢!
- 内存映射(CreateFileMapping )使用问题
- 想发财的朋友请来这里坐坐
- 取出各个Frame的IHTMLDocument2,如何得到各个frame的坐标呀
- vc中有对wav文件音量控制的类和方法吗?
- 调用2个DLL中的同名函数问题
- 敬请各位大哥讲解一下我这个苦恼问题,谢谢!
- 关于DirectDraw的Flip问题~~
你是如何解析server发过来的数据的,一包包的马?你的client如何区分当前数据属于某个xml呢?
有可能是你的client解析又问题,这个200k是server发出的n个包,有可能这些数据属于多个xml文件,但是你没有区分的存入一个文件中,当然会解析错。用tcp传送数据很关键的就是包的识别和定界,不然server发出多个包,而client有可能一次读到,只是与udp不同的。
int byte_left, byte_send, byte_sum;
char *p; byte_left = len;
p = buf;
byte_sum = 0;
while(byte_left > 0) {
byte_send = send(sock, p, byte_left, 0);
if(byte_send < 0) {
perror("writing socket");
return(-1);
}
else if(byte_send == 0 ){
break;
}
byte_sum += byte_send;
byte_left = byte_left - byte_send;
p = p + byte_send;
} if(byte_sum != len){
return -1;
}
else{
return 0;
}
client是异步模式,server是同步模式(用多线程处理)
我现在是这样做的,每次发送一个XML,前面都有一个32个字节的包头,里面有数据的长度,客户端就是根据这个长度来读取数据的,如果读到的数据和包头声明的不一致,客户端会返回一个错误
所以现在客户端接收到的数据长度应该是正确的
但是+了AfxMessageBox("s");之后。。就都能接受到了。。这个很奇怪