初学mfc,想用CAsyncSocket类实现最简单的一个代理功能,就是把从客户端接收到的信息原封不动的发到目的地,从目的地接受回来的信息也原封不动的发给客户端,但是对于receive和send方法里面的参数buff有些疑惑,这个buff的大小应该是可变的才对,比如用ie当客户端时,我用一个char数组接收,如果buff过小,那么请求就不完整,而如果buff过大,后面又会跟上一串乱码,我是用charBuff=new char[512];这样的方法初始化数组的,我希望在receive的时候把请求接受完毕后用strlen能正确的统计请求的大小而不会多接受,可是现在我把收到的buff显示出来后面会更上很多乱码,这应该是初始化buff的时候内存中的无效数值,这些可以不要吗?还有就是接受的时候,每个网页大小都肯定不一样,我不可能用一个很大的buff去接受,如果我要把这些信息都传回给ie应该要怎么做呢?希望有经验的人帮忙解答下,谢谢!

解决方案 »

  1.   

    buffer是你的缓冲区,大小是固定的,如果有数据过来,就要及时的把数据读取出来,然后把buffer进行清空的操作。如果你这边的buffer已经满了,对方发送数据就会失败,或者收到对方socket正在忙的信息。所以你要监听socket,收到数据后立马进行读取数据,清空buffer的操作。对于你怀疑数据收发不完整的方面,其实这是通过收发双方的控制来完成的。假设发送方是完美的,接收方一定可以收到数据,并且不丢包的情况下,那么你有时候接受到的数据是不完全的,这就需要你自己再建立一个buffer来缓存数据,并自己拼接数据。
      

  2.   

    谢谢啊,原来还这么麻烦,我还以为原封不动的发和送会比较简单呢,也就是当有onReceive的时候用Receive方法把buff接收下来,再用一个buff把这个buff的内容拷进来,然后把原来的buff清空对吗,这个清空要用什么方法呢?还有当最后一点数据的时候,buff是装不满的,这样后面的数据都会是乱码,有什么方法可以去掉吗,对于http服务器返回的数据,难道都要自己去判断是否结尾?如果是ftp呢,不是又不一样,有没有什么比较统一的方法能判断是否数据已经接收完全了,java下好像有available方法可以不会接受无效的数据的,c下面有没有类似的方法呢?
      

  3.   

    如果buff过大,后面又会跟上一串乱码???
    调用Receive后可以返回接收到的字符数n,此时后面添加一条语句charBuff[n]=NULL;就可以了啊
      

  4.   

    buf一开始要初始化啊
    你是没初始化
    memset(buf,0,sizeof(buf));