Visual C#中的套接字。需要帮忙!

时间:2010-01-05 02:50:01

标签: c# sockets

我来自Urkraine,英语不好,但无论如何不确定我的问题是否有答案。

我从[here] [1]中拿了例子,但我有例外,GZip魔法数字无效,为什么?

    public long WriteUrl()
    {
        long num1 = 0;
        bool saveItAtCache = false;
        bool existsAtCache = false;
        byte[] cachedFile = null;
        string ext = Path.GetExtension(_url).ToLower();
        if (!_url.Contains(".php") && ".gif.jpg.swf.js.css.png.html".IndexOf(ext) != -1 && ext != "")
        {
            saveItAtCache = true;
            cachedFile = cache.GetFile(_url);
            existsAtCache = (cachedFile != null);
        }
        if (existsAtCache)
        {
            writeSuccess(cachedFile.Length, null);
            socket.Send(cachedFile);
        }
        string host = new Uri(_url).Host;
        IPHostEntry ipAddress = Dns.GetHostEntry(host);
        IPEndPoint ip = new IPEndPoint(ipAddress.AddressList[0], 80);
        using (Socket s = new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp))
        {
            s.Connect(ip);
            using (NetworkStream n = new NetworkStream(s))
            {
                if (HttpRequestType == "GET")
                {
                    SendRequest(n, new[] { socketQuery});
                }
                Dictionary<string, string> headers = new Dictionary<string, string>();
                while (true)
                {
                    string line = ReadLine(n);
                    if (line.Length == 0)
                    {
                        break;
                    }
                    int index = line.IndexOf(':');
                    if (!headers.ContainsKey(line.Substring(0, index)))
                    {
                        headers.Add(line.Substring(0, index), line.Substring(index + 2));
                    }
                }

                string contentEncoding;
                if (headers.TryGetValue("Content-Encoding", out contentEncoding))
                {
                    Stream responseStream = n;
                    if (contentEncoding.Equals("gzip"))
                    {
                        responseStream = new GZipStream(responseStream, CompressionMode.Decompress, true);
                    }
                    else if (contentEncoding.Equals("deflate"))
                    {
                        responseStream = new DeflateStream(responseStream, CompressionMode.Decompress);
                    }

                    var memStream = new MemoryStream();

                    var respBuffer = new byte[4096];
                    try
                    {
                        int bytesRead = responseStream.Read(respBuffer, 0, respBuffer.Length);
                        //int bytesRead = responseStream.Read(respBuffer, 0, respBuffer.Length);
                        while (bytesRead > 0)
                        {
                            memStream.Write(respBuffer, 0, bytesRead);
                            bytesRead = responseStream.Read(respBuffer, 0, respBuffer.Length);
                        }
                    }
                    finally
                    {
                        responseStream.Close();
                    }
                    string str = encoding.GetString(memStream.ToArray());
                    ManageCookies(headers["Set-Cookie"], _headers["Host"]);
                    cachedFile = encoding.GetBytes(str);
                    if (saveItAtCache)
                    {
                        cache.Store(_url, cachedFile);
                    }
                    writeSuccess(cachedFile.Length, headers["Set-Cookie"]);
                    socket.Send(cachedFile);
                    num1 = str.Length;
                }
                else
                {
                    while (true)
                    {
                        string line = ReadLine(n);
                        if (line == null)
                        {
                            break;
                        }
                        num1 = line.Length;
                    }
                }
            }
        }

        return num1;
    }

1 个答案:

答案 0 :(得分:0)

在这些行中

                string str = encoding.GetString(memStream.ToArray());
                ManageCookies(headers["Set-Cookie"], _headers["Host"]);
                cachedFile = encoding.GetBytes(str);

您将字节数组转换为字符串,然后再转换回字节数组。由于原始数据是gzip或jpg或其他什么而不是真正的字符串,因此这种转换可能会搞砸了。我根本没有看到你使用str,所以只需要把它取出来(当你需要长度而不是str.Length时使用cachedFile.Length。)

相关问题