解决方案 »
- 在XP系统下调用::SQLDisconnect没有返回,WIN7下则OK
- 如何显示旋转文字?
- VC开发者请进!!!!!
- 我的管理工具中的ODBC数据源变成日文的了,怎么恢复
- 求windows2000编程技术内幕的随书源码?能提供的高分相送!
- 蹊跷的问题!帮我看看!
- vc6.0编译器汉化创天中文版bug?
- 请教关于文件映射的问题
- CListCtrl ICON风格 设置扩展属性LVS_EX_HIDELABELS为什么没有效果?
- 谁能介绍一些用VC开发过关于数据库方面的软件吗!
- MFC在debug模式下编译程序时出现了Debug Assertion Failed!
- 用WideCharToMultiByte将Unicode文本转换成Ansi文本,BOM头会被转换吗?
fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待
和
fopen("...","...b");fseek,fread,fwrite,fgetc,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://bbs.csdn.net/topics/380167545
CStdioFile file;
CString strText =L"";
CString szLine =L"";
file.Open(L"d://aecgtest.xml",CFile::modeRead);
while(file.ReadString(szLine ))
{
strText += szLine;
}
//MessageBox(strText);
szLine=L"";
file.Close();
然后将strText转成char*类型,赋值给buffer[250000],再然后send(m_SockClient,buffer,sizeof(buffer),0);
服务器端同样用buffer[250000]来接收:recv(hsock,buffer,sizeof(buffer),0);
请问这样有什么不合适的么。。
看上去像widechar问题。.xml一般是utf8编码的(实际内容仍然是单字节ascii串),不会是你的file.ReadString将它作为unicode文件进行读取了吧? 这样所有不能识别的unicode编码都会被替换 -- 也就是说从内存字节来看读出来内容的和文件中内容是不同的。
看上去像widechar问题。.xml一般是utf8编码的(实际内容仍然是单字节ascii串),不会是你的file.ReadString将它作为unicode文件进行读取了吧? 这样所有不能识别的unicode编码都会被替换 -- 也就是说从内存字节来看读出来内容的和文件中内容是不同的。
谢谢,在客户端读取的xml文件内容strText是良好的,本人测试可以将其正确写到文本中,这里的问题关键是在socket传输上面,客户端发送方成功发送了所有数据,但是服务器接收方不能完全接收。。
一般通信,是先把包长发给server,
server根据这个包长来判定是不是要继续接收
恩现在循环接收ok了,但是中间个别次循环末尾还是带有小段乱码。。正常部分可以和下次接收的开头连接起来,但是乱码怎么来的。。纯多余。。
恩现在循环接收ok了,但是中间个别次循环末尾还是带有小段乱码。。正常部分可以和下次接收的开头连接起来,但是乱码怎么来的。。纯多余。。你发送时就是带乱码发送的
1.首先是接收到的文件内容前半部分正常,后面部分乱码的问题。
这里楼主在 发送方发送了buffer[250000],接收方使用buffer[250000]来接收,对于接收方的buffer,析取出来的文件带有大量的乱码,乱码是什么?相信初次接触文件的同志们难免会遇到,这是由于我们在定义缓冲区的时候:char buffer[250000];缓冲区内存原本是有内容的,通常的做法是memset(buffer,0,sizeof(buffer))将其清空。ok,清空之后再显示,接收方的数据大概只有2w多的字符,文件内容长度经测试大概是23w多的样子。。现在问题来了:按常理说,如果一次接收完全了的话,应该是23w才对,那么问题都指向->接收方1次接收不完全。。
2.如果发送方1次发送大量数据,接收方1次能接收的数据量到底是多少?
在问题1中,测试大概是2w多个字符,但是到底一次收多少,楼主查阅了大量的资料没有个定论,基本都是论坛个人发帖,不可信。于是这个问题当时暂且放下了。。楼主决定应广大网友的建议,进行多次接收。。
3.如何进行多次接收?
如何多次接收?楼主是这样处理的,鉴于之前的测试一次收了2w多的字符,于是楼主决定用buf[30000]来循环接收,然后每次拼接到buffer后面。控制循环是根据文件的长度,这里不再赘述。。于是楼主之后终于把23w多的字符成功析取出来了。
4.新的问题:个别地方存在乱码
这些乱码不长,大概几个字符,是属于多余出来的,乱码前后部分可以正常拼接起来。。楼主做了大量测试,发现有乱码的部分当次recv返回的值都是3w!3w是什么?buf[30000]!相信各位看官都发现了,说明缓冲区小了,于是楼主开始加大buf的长度,从3w渐渐扩充,发现无论多大都总会越界,于是楼主毛了,使用了buf[250000],结果发现这次居然一次就recv返回了25w,循环只执行了一次。
5.回到那个问题:1次到底接收多少?
楼主在隔天的测试时,发现每次recv返回的值可能是3w,4w,5w不等,运气好的时候可以recv到25w。。这说明收多少完全是看计算机当时的状况。。涉及内存,运行速度多方面(楼主猜测)。
6.应该怎么办?
发送方没有要求,1次可全部发送完;接收方,楼主总结为双保险:大缓冲区接收和循环接收,因为你根本不知道接收1次会接收多少从而也不知道会接收几次。。
http://blog.csdn.net/naturebe/article/details/6712153