调试时,发现
recv = socket.Receive(data);
这句问题。但又不知时什么问题?怎么解决?
会不会时数据溢出了?namespace mydemo
{
    class MyConnection
    {
     public void StartAccess( string urlStr ,int port , string path , string submitmethod, string postdata, TextBox list )
        {        
         byte[] data = new byte[187385];            int datalen = postdata.Length;
            
            IPHostEntry gist = Dns.GetHostEntry( urlStr );            //得到所访问的网址的IP地址
            IPAddress ip = gist.AddressList[0];
            IPEndPoint ipEnd = new IPEndPoint(ip, port);            //使用tcp协议 stream类型 (IPV4)
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            
                        try
            {
                socket.Connect(ipEnd);
            }
            catch(SocketException e)
            {
                MessageBox.Show("连接目标服务器失败。\n1、可能目标服务器已不可用。\n2、地址填写错误。");
                Console.Write(e.ToString());
                return;
            }
            //这里请求的相对地址,如果访问直接www.baidu.com则不需要,可以为空.            MessageBox.Show(Convert.ToString(datalen));
            
            StringBuilder buf = new StringBuilder();
            buf.Append(submitmethod+" ").Append("http://"+urlStr).Append(path).Append(" HTTP/1.1\r\n");
            buf.Append("Host: "+urlStr+"\r\n");
            buf.Append("Connection: keep-alive\r\n");
            buf.Append("Referer: http://"+urlStr+path+"\r\n");
            buf.Append("Content-Length: "+datalen+"\r\n");
            buf.Append("Cache-Control: max-age=0\r\n");
            buf.Append("Origin: http://"+urlStr+"\r\n");
            buf.Append("Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n");
            buf.Append("Content-Type: application/x-www-form-urlencoded\r\n");
            buf.Append("User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.63 Safari/534.3\r\n");
            buf.Append("Accept-Encoding: gzip,deflate,sdch\r\n");
            //buf.Append("Accept-Language: zh-CN,zh;q=0.8\r\n");
            buf.Append("Accept-Charset: utf-8\r\n");
            //buf.Append("Cookie: rtime=0; ltime=1286510985674; cnzz_eid=53214426-1286510969-\r\n");
            buf.Append("\r\n");
            buf.Append(postdata);
            buf.Append("\r\n");
            
            byte[] ms = System.Text.UTF8Encoding.UTF8.GetBytes(buf.ToString());            //发送
            socket.Send(ms);
            
            int recv =0;
           
            do
            {
                //下面这句有问题。
             recv = socket.Receive(data);
                //如果请求的页面meta中指定了页面的encoding为gb2312则需要使用对应的Encoding来对字节进行转换
                list.Text += (Encoding.UTF8.GetString(data, 0, recv));
                //list.Text += (Encoding.Default.GetString(data, 0, recv));                
            } while (recv != 0);            //禁用上次的发送和接受
            socket.Shutdown( SocketShutdown.Both );
            socket.Close();
        }
    }
}

解决方案 »

  1.   

    System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接。
    at System.Net.Sockets.Socket.Receive
    at System.Net.Sockets.Socket.Receive哪位能否帮我优化下上面的代码或指导下哪个语句累赘?
      

  2.   

    这个很明显嘛,异常都说清楚了,
    你的套接字被远程强迫关闭,也就是说你的连接被断开了,你得做重连机制。从代码中可以看出你是在使用套接字来模拟Http请求,
    你要注意一点:一个Http服务器,在你的连接超过指定时间没有任何动作的话,将会强制把你断开。你的循环代码写得有点问题:
    Receive方法是阻塞性的,除非收到数据,否则一直阻塞住,除非你设置了超时,也就是说,recv在你的代码中永远不会返回0,你的循环将无法退出,直到服务器将你断开,引发异常
      

  3.   

    如果你做模拟Http请求的话,需要做Http头的分析,你请求服务器的时候,服务器会返回Http头,Http头和Http正文内容是使用两个回车换行符分开,通常情况下,Http头都会包含一个Content-Length的属性,你只要分析到这个属性之后,就可以很容易判断出什么时候数据接收完毕,主动断开连接,而不必等到服务器来强制断开