代码如下
 System.Threading.Thread.Sleep(200);
        Byte[] buffer = new Byte[8192];//一个8×1024bits的缓存区 
        do
        {
            availCount = sock.Available;            if (availCount < buffer.Length)
            {
                recvCount = sock.Receive(buffer, availCount, SocketFlags.None);
            }
            else
            {
                recvCount = sock.Receive(buffer, buffer.Length, SocketFlags.None);
            }            availCount = sock.Available;
            if (recvCount > 0)
            {
                receiveData += Encoding.GetEncoding("GB18030").GetString(buffer, 0, recvCount);
            }
        }
        while (availCount > 0);
经常只能收到这样的数据
POST / HTTP/1.1
Host: 172.16.92.14:9000
Content-Length: 620
Expect: 100-continue
Connection: Keep-Alive下面的内容都没了

解决方案 »

  1.   

    没怎么做过这方面,我看MSDN上例子这样写的Byte[] RecvBytes = new Byte[256];
    Int32 bytes = s.Receive(RecvBytes, RecvBytes.Length, 0);
          while (bytes > 0)
          {
            bytes = s.Receive(RecvBytes, RecvBytes.Length, 0);
          }
      

  2.   

    楼主的读法真叫我晕。
    楼主要处理 HTTP请求的话这样看着也真别扭。  最好是一读一计数,读完就中断。另外GetEncoding("GB18030").  是啥意思呢?
    中文系统一般是 GB2312 或者HTTP服务程序 用UTF8也一般不会有错。是不是你的编码也不对啊?
      

  3.   

    楼主的读法真叫我晕。 
    楼主要处理 HTTP请求的话这样看着也真别扭。  最好是一读一计数,读完就中断。 另外GetEncoding("GB18030").  是啥意思呢? 
    中文系统一般是 GB2312 或者HTTP服务程序 用UTF8也一般不会有错。是不是你的编码也不对啊?
    -----------------------------------
    这里只是读取的代码
    外围在读取完毕处理后,有做中断
     sock.Shutdown(SocketShutdown.Both);
            sock.Close();GB18030这里只是编码格式,客户端发送的是GB18030编码。格式应该无所谓
      

  4.   

    请参考: 可扩展多线程异步Socket服务器框架EMTASS 2.0
      

  5.   

    直接用阻塞式同步Socket循环读取就好了。
      

  6.   

    直接用阻塞式同步Socket循环读取就好了。 
    ----------------------------------------------------
    这里是完整代码
    Socket ssock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress hostIp = Dns.GetHostEntry(Ip).AddressList[0];
                int MiscPort = 8000;
                IPEndPoint ep = new IPEndPoint(hostIp, MiscPort);
                ssock.Bind(ep); //绑定
                Console.WriteLine("开始侦听CP数据.");//开始侦听
                ssock.Listen(32);
                bool isListen = true;
                while (isListen)
                {                
                    Socket sock = ssock.Accept(); //等待客户端请求                
                      BaseConnection client = new BaseConnection(sock);
                    try
                    {
                        /***
                        上面的读取缓冲区的代码
                        ****                    /
                        返回响应包 
                        sendResponse(resp);                }
                    catch (Exception e)
                    {
                      Console.WriteLine("--" + e.Message);
                    }
                    finally
                    {
                        client.ConClose(); //关闭连接
                    }
                    Console.WriteLine("结束一个请求");
                    Console.WriteLine("////////////////////////////////////////////////");
                }现在的情况很奇特,有时候在一个时间段内什么都读不到,有时候就读到一部分的数据,POST的内容都没有,有时候就能读到完整的
      

  7.   

    你这个是服务端?可以用HTTPListener或者用异步实现。
      

  8.   

    采用异步方式 ,还是一样会丢包
      string  Format = "utf-8";
                HttpWebRequest req = (HttpWebRequest)System.Net.HttpWebRequest.Create(Url);
                req .Method = "POST";
                Stream stream= req .GetRequestStream();
                StreamWriter wr= new StreamWriter(stream, Encoding.GetEncoding(Format ));
     wr.Write(str);
                wr.Close();
                stream.Close();
                StreamReader reader = new StreamReader(req.GetResponse().GetResponseStream(), Encoding.GetEncoding(Format ));
        
      string xml = reader.ReadToEnd();
    这是发包方的发送代码
    异步方式,接受端经常只检测到有ip连接,然后没有响应,后面的数据都抓不到了
      

  9.   

    我是采用循环读包的模式
    不过现在产生另外一个问题,我当发包方做了一个for循环的发包的时候,
    for (int i=0;i<10;i++)
    {
    string  Format = "utf-8"; 
                HttpWebRequest req = (HttpWebRequest)System.Net.HttpWebRequest.Create(Url); 
                req .Method = "POST"; 
                Stream stream= req .GetRequestStream(); 
                StreamWriter wr= new StreamWriter(stream, Encoding.GetEncoding(Format )); 
    wr.Write(str); 
                wr.Close(); 
                stream.Close(); 
                StreamReader reader = new StreamReader(req.GetResponse().GetResponseStream(), Encoding.GetEncoding(Format )); 
        
      string xml = reader.ReadToEnd(); 
    }
    本机调测,当i到1-3次不等的时候,就抛出这样的错误:
    基础连接已经关闭: 服务器关闭了本应保持活动状态的连接。是因为客户端发布速度太快了么?