C# NetworkStream, проблемка с чтением

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _nic, 5 Aug 2010.

  1. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Использовал в своем классе пример из МСДН,но только вот он не работает как надо :confused: Данные считывается не полностью,смотрю в упор и невижу проблемы :( Ведь цикл должен длится пока поступают данные и открыт сокет...
    Code:
    public class ParseSite
            {
                private TcpClient TCl;
                private NetworkStream Stream;
                private string host;
                private byte[] buf;
                private static byte[] StrToByteArray(string str)
                {
                    System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
                    return encoding.GetBytes(str);
                }
                public ParseSite(string site)
                {
                    buf = new byte[1024 * 1024];
                    host = site;
                }
                public void Connect()
                {
                    TCl = new TcpClient(host, 80);
                    Stream = TCl.GetStream();
                }
                private void Close()
                {
                    Stream.Close();
                    TCl.Close();
                }
                public string GetPage(string link)
                {
                    string request = "GET /" + link + " HTTP/1.1" + "\r\nHost: " + host + "\r\nConnection: Close\r\n\r\n";
                    buf = StrToByteArray(request);
                    Stream.Write(buf, 0, request.Length);
                    StringBuilder myCompleteMessage = new StringBuilder();
                    int numberOfBytesRead = 0;
                    do
                    {
                        numberOfBytesRead = Stream.Read(buf, 0, buf.Length);
                        myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(buf, 0, numberOfBytesRead));
                    }
                    while (Stream.DataAvailable);
                    this.Close();
                    return (myCompleteMessage.ToString());
                }
            }
    
     
  2. FEV

    FEV Member

    Joined:
    23 Sep 2009
    Messages:
    15
    Likes Received:
    7
    Reputations:
    0
    ТС, ситуация знакомая. У самого когда-то была такая проблема. Помню, я еще был удивлен, когда под отладчиком в пошаговом режиме все прекрасно работало, без отладчика читалась только часть данных.
    1 способ:
    Вся проблема в этом цикле:
    Нельзя ориентироваться на Stream.DataAvailable, т.к. это св-во возвращает совсем не то что нужно; В рфц про протокол ХТТП четко перечислены признаки, по которым можно прекращать чтение. Т.к. у тебя сервер закрывает соединение сразу после передачи данных ("Connection: Close"), то можно выходить из цикла если
    numberOfBytesRead < 0;

    2 способ:
    использовать классы HttpWebRequest\HttpWebResponse;
     
  3. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Так ещё хуже,грузится только маленький кусочек заголовка
     
  4. FEV

    FEV Member

    Joined:
    23 Sep 2009
    Messages:
    15
    Likes Received:
    7
    Reputations:
    0
    так попробуй.
     
Loading...