解决方案 »

  1.   

    推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。不要把
    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
      

  2.   

    本人文件客户端读取文件是采用的CStdioFile,代码如下
    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);
    请问这样有什么不合适的么。。
      

  3.   

    楼主测试了一下,客户端的send函数返回值是250000没错,服务器端recv函数的返回值是27740。。意思是发送所有数据成功,但是接收却不完全,,何解??
      

  4.   


    看上去像widechar问题。.xml一般是utf8编码的(实际内容仍然是单字节ascii串),不会是你的file.ReadString将它作为unicode文件进行读取了吧? 这样所有不能识别的unicode编码都会被替换 -- 也就是说从内存字节来看读出来内容的和文件中内容是不同的。
      

  5.   


    看上去像widechar问题。.xml一般是utf8编码的(实际内容仍然是单字节ascii串),不会是你的file.ReadString将它作为unicode文件进行读取了吧? 这样所有不能识别的unicode编码都会被替换 -- 也就是说从内存字节来看读出来内容的和文件中内容是不同的。
    谢谢,在客户端读取的xml文件内容strText是良好的,本人测试可以将其正确写到文本中,这里的问题关键是在socket传输上面,客户端发送方成功发送了所有数据,但是服务器接收方不能完全接收。。
      

  6.   

    接收不全,继续收,直到接收数据长度符合要求为止
    一般通信,是先把包长发给server,
    server根据这个包长来判定是不是要继续接收
      

  7.   

    问题应该是2.。数据接收不完整,,难道是有长度限制么??求解啊你不会只recv一次吧? 一次recv最多收8k(默认recv buffer长度),你必须用循环反复调用recv()并且拼到上次recv的后面
      

  8.   

    问题应该是2.。数据接收不完整,,难道是有长度限制么??求解啊你不会只recv一次吧? 一次recv最多收8k(默认recv buffer长度),你必须用循环反复调用recv()并且拼到上次recv的后面
    恩现在循环接收ok了,但是中间个别次循环末尾还是带有小段乱码。。正常部分可以和下次接收的开头连接起来,但是乱码怎么来的。。纯多余。。
      

  9.   

    问题应该是2.。数据接收不完整,,难道是有长度限制么??求解啊你不会只recv一次吧? 一次recv最多收8k(默认recv buffer长度),你必须用循环反复调用recv()并且拼到上次recv的后面
    恩现在循环接收ok了,但是中间个别次循环末尾还是带有小段乱码。。正常部分可以和下次接收的开头连接起来,但是乱码怎么来的。。纯多余。。你发送时就是带乱码发送的
      

  10.   

    楼主现在准备终结此帖了,其中涉及到的问题楼主会一一展开来解释。
    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次会接收多少从而也不知道会接收几次。。
      

  11.   

    给个学习链接,结帖。
    http://blog.csdn.net/naturebe/article/details/6712153