这是代码:
public static void SendRecive(string host, byte[] msg, ref string HttpResponse)
            {
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            s.Blocking = true;
            s.ReceiveTimeout = -1;
            //Socket d=new Socket((AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                
                s.Connect(host, 80);
                s.Send(msg);
                byte[] msgout = new byte[1000];
                Encoding gbk = Encoding.GetEncoding(936);
                int i = 0;
                while(true)
                {
                    Array.Clear(msgout, 0, 1000);                    i = s.Receive(msgout, msgout.Length, SocketFlags.None);
                    HttpResponse += gbk.GetString(msgout);
                    if (i <= 0) break;
                   
                } 
            }
            catch (Exception e) {                Console.WriteLine("Exception caught!!!");
                Console.WriteLine("Source : " + e.Source);
                Console.WriteLine("Message : " + e.Message);
            }
            s.Shutdown(SocketShutdown.Receive);
            s.Close();
            }这种情况,有时能接收到1000个字符,有时2000字符
但是如果是单步调试,就可以收到全部(大概是8000个字符左右)
不知为什么会这样,在这里卡了很久,希望csdn能给我些帮助,谢谢!

解决方案 »

  1.   

    你定义的数组时1000,可以收到8000个么,看看你的缓存大小,
          if (i <= 0) break;
    当收到的数据长度小于0时就推出么?
      

  2.   

    相当怪异的事发生了:当我把 Array.Clear(msgout, 0, 1000),去掉时,则不单步执行也可以收到几乎所有的数据(不过会少了最后一点点数据(为什么为什么?)
    当我再把byte[] msgout = new byte[1000];变为byte[] msgout = new byte[1024];又只有一点点数据,这是为什么?怎么会发生这么怪异的事!!!
      

  3.   

    个人感觉是不是应该先把所有的字节接收完成之后,再用 gbk.GetString(msgout)转化成字符串。因为并不保证你每次接收的字节正好成够成字字符串的正确编码
      

  4.   

    你网络可能充斥了ARP之类的广播风暴,比如路由器的连接有问题或者有多个相互竞争的网络服务之类的。这个时候,比如说发送端一次发送10k数据,接收端可能接收到2k,这时候 i==0 成立。可是假设你再重试几次,就有能继续接收数据了。网络通讯要设计明确的通讯协议,什么时候算是接收结束,不仅仅要看是否 i==0,还要看是否你接收到的数据恰好以结束标志来结束!
      

  5.   

    最简单的做法就是规定一个特殊字符作为结束符(如EOF),不要使用长度为0判断跳出,判断接收到结束符认为本次报文结束。否则无法解决这个问题。
      

  6.   

    通常的商用通讯组件(IPworks、tuxedo等)都是使用结束符来保证报文完整的,同时还可以在报文指定位置加入MAC校验为来保证报文未被篡改。