Autor Beitrag
nonamez78
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mi 29.04.09 19:44 
Hallo!

Angemeldet hatte ich mich bei Euch schon vor Wochen, bisher kam ich aber mit reinem Lesen recht gut voran.

Zur Zeit versuche ich einen HTTP-Uploader hinzubekommen, der auch mit großen Dateien sauber funktioniert. Der Webclient war mir zu unflexibel, weshalb ich irgendwann beim TcpClient geladent bin.

Der angehängte Code funktioniert an sich bestens. Die Daten werden fehlerfrei übertragen und sind sogar nach der Übertragung noch les- und nutzbar ;).

Durch diesen Punkt zufriedengestellt wollte ich als nächstes mit der benötigten Progressbar beginnen, wo aber die Probleme direkt anfingen.

Scheinbar wird sofort die komplette Datei in einen Zwischenpuffer geschrieben, was eine Anzeige von 0 direkt auf 100% springen lässt. An sich kein Beinbruch, aber der Puffer scheint vollständig unabhängig von C# zu sein. Normalerweise hätte ich angenommen, dass nach dem Beenden des Testprogrammes auch der Upload abbricht, aber weit gefehlt.
Selbst nach dem Abbruch läd die Datei weiter hoch, obwohl ich keinen Prozess mehr im Taskmanager sehen kann (auch nicht wenn wirklich alle eingeblendet sind). Auch das Schliessen der Express IDE oder das Ausführen als Standalone Tool bringt keine Änderung.

Weiss jemand was ich da falsch mache? Das Reduzieren des Sendepuffers bringt rein gar nichts, es scheint irgendwo direkt vom Betriebssystem eine Pufferung stattzufinden.

Vielen Dank im voraus!

Gruß,


Wolfgang

P.S.: Mir ist bewusst, dass der Code ein reines Chaos ist, aber es ist nur ein reiner Test ;).


ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.IO;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string filepath = "D:\\Test\\";
            string filename = "test.bin";
            string hostname = "server.de";

            string divider = "---------------------------24464570528145";
            string header = "";

            String uploadfile = "--" + divider + "\r\nContent-Disposition: form-data; name=\"file\"; filename=\"" + filename + "\"\r\n\r\n";

            StringBuilder postvars = new StringBuilder("\r\n--" + divider + "\r\nContent-Disposition: form-data; name=\"field_1\"\r\n\r\ncontent_field_1\r\n");
            postvars.Append("--" + divider + "\r\nContent-Disposition: form-data; name=\"field_2\"\r\n\r\ncontent_field_2\r\n");
            string s = "\r\n" + divider + "--\r\n";

            int filesize = (int)new FileInfo(filepath + filename).Length;

            int length = uploadfile.Length + postvars.Length + s.Length + filesize;
            header = "POST /tmp/upload.php HTTP/1.0\r\nHost: " + hostname + "\r\nUser-Agent: NNUPloader\r\nContent-Type: multipart/form-data; boundary=" + divider + "\r\nContent-Length: " + length + "\r\n\r\n";

            string input = "";
            using (TcpClient client = new TcpClient())
            {
                client.Connect(hostname, 80);
                client.SendBufferSize = 8192;
                using (NetworkStream stream = client.GetStream())
                {
                    byte[] bytes = Encoding.UTF8.GetBytes(postvars + s);
                    byte[] buffer = Encoding.UTF8.GetBytes(header + uploadfile);

                    stream.Write(buffer, 0, buffer.Length);

                    foreach (byte b in buffer)
                    {
                        char singleChar = Convert.ToChar(b);
                        Debug.Write(singleChar.ToString());
                    }

                    using (FileStream stream2 = new System.IO.FileInfo(filepath + filename).OpenRead())
                    {
                        byte[] buffer3 = new byte[10000];
                        int count = 10000;
                        int num6 = 0;
                        while ((num6 = stream2.Read(buffer3, 0, count)) > 0)
                        {
                            stream.Write(buffer3, 0, num6);
                            System.Console.Write(".");
                            /*foreach (byte b in buffer3)
                            {
                                char singleChar = Convert.ToChar(b);
                                Debug.Write(singleChar.ToString());
                            }*/

                        }
                        stream.Write(bytes, 0, bytes.Length);
                        
                        foreach (byte b in bytes)
                        {
                            char singleChar = Convert.ToChar(b);
                            Debug.Write(singleChar.ToString());
                        }
                        input = new StreamReader(stream).ReadToEnd();
                    }
                    stream.Close();
                }
            }

            System.Console.Write(input);

            System.Threading.Thread.Sleep(100000);

        }
    }
}


Moderiert von user profile iconKha: Code- durch C#-Tags ersetzt
k3nscher
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 22.05.09 23:22 
user profile iconnonamez78 hat folgendes geschrieben Zum zitierten Posting springen:
Hallo!

Angemeldet hatte ich mich bei Euch schon vor Wochen, bisher kam ich aber mit reinem Lesen recht gut voran.

Zur Zeit versuche ich einen HTTP-Uploader hinzubekommen, der auch mit großen Dateien sauber funktioniert. Der Webclient war mir zu unflexibel, weshalb ich irgendwann beim TcpClient geladent bin.

Der angehängte Code funktioniert an sich bestens. Die Daten werden fehlerfrei übertragen und sind sogar nach der Übertragung noch les- und nutzbar ;).

Durch diesen Punkt zufriedengestellt wollte ich als nächstes mit der benötigten Progressbar beginnen, wo aber die Probleme direkt anfingen.

Scheinbar wird sofort die komplette Datei in einen Zwischenpuffer geschrieben, was eine Anzeige von 0 direkt auf 100% springen lässt. An sich kein Beinbruch, aber der Puffer scheint vollständig unabhängig von C# zu sein. Normalerweise hätte ich angenommen, dass nach dem Beenden des Testprogrammes auch der Upload abbricht, aber weit gefehlt.
Selbst nach dem Abbruch läd die Datei weiter hoch, obwohl ich keinen Prozess mehr im Taskmanager sehen kann (auch nicht wenn wirklich alle eingeblendet sind). Auch das Schliessen der Express IDE oder das Ausführen als Standalone Tool bringt keine Änderung.

Weiss jemand was ich da falsch mache? Das Reduzieren des Sendepuffers bringt rein gar nichts, es scheint irgendwo direkt vom Betriebssystem eine Pufferung stattzufinden.

Vielen Dank im voraus!

Gruß,


Wolfgang

P.S.: Mir ist bewusst, dass der Code ein reines Chaos ist, aber es ist nur ein reiner Test ;).


ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.IO;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string filepath = "D:\\Test\\";
            string filename = "test.bin";
            string hostname = "server.de";

            string divider = "---------------------------24464570528145";
            string header = "";

            String uploadfile = "--" + divider + "\r\nContent-Disposition: form-data; name=\"file\"; filename=\"" + filename + "\"\r\n\r\n";

            StringBuilder postvars = new StringBuilder("\r\n--" + divider + "\r\nContent-Disposition: form-data; name=\"field_1\"\r\n\r\ncontent_field_1\r\n");
            postvars.Append("--" + divider + "\r\nContent-Disposition: form-data; name=\"field_2\"\r\n\r\ncontent_field_2\r\n");
            string s = "\r\n" + divider + "--\r\n";

            int filesize = (int)new FileInfo(filepath + filename).Length;

            int length = uploadfile.Length + postvars.Length + s.Length + filesize;
            header = "POST /tmp/upload.php HTTP/1.0\r\nHost: " + hostname + "\r\nUser-Agent: NNUPloader\r\nContent-Type: multipart/form-data; boundary=" + divider + "\r\nContent-Length: " + length + "\r\n\r\n";

            string input = "";
            using (TcpClient client = new TcpClient())
            {
                client.Connect(hostname, 80);
                client.SendBufferSize = 8192;
                using (NetworkStream stream = client.GetStream())
                {
                    byte[] bytes = Encoding.UTF8.GetBytes(postvars + s);
                    byte[] buffer = Encoding.UTF8.GetBytes(header + uploadfile);

                    stream.Write(buffer, 0, buffer.Length);

                    foreach (byte b in buffer)
                    {
                        char singleChar = Convert.ToChar(b);
                        Debug.Write(singleChar.ToString());
                    }

                    using (FileStream stream2 = new System.IO.FileInfo(filepath + filename).OpenRead())
                    {
                        byte[] buffer3 = new byte[10000];
                        int count = 10000;
                        int num6 = 0;
                        while ((num6 = stream2.Read(buffer3, 0, count)) > 0)
                        {
                            stream.Write(buffer3, 0, num6);
                            System.Console.Write(".");
                            /*foreach (byte b in buffer3)
                            {
                                char singleChar = Convert.ToChar(b);
                                Debug.Write(singleChar.ToString());
                            }*/

                        }
                        stream.Write(bytes, 0, bytes.Length);
                        
                        foreach (byte b in bytes)
                        {
                            char singleChar = Convert.ToChar(b);
                            Debug.Write(singleChar.ToString());
                        }
                        input = new StreamReader(stream).ReadToEnd();
                    }
                    stream.Close();
                }
            }

            System.Console.Write(input);

            System.Threading.Thread.Sleep(100000);

        }
    }
}


Moderiert von user profile iconKha: Code- durch C#-Tags ersetzt


Hi,
ich versuche mich zurzeit auch mit einem Uploader. Ich schaffe es aber nicht mit der WebClient Klasse größere Dateien zu verschicken. Ich hab schon alles probiert. Selbst die Analyse mit Wireshark hat mich nicht weitergebracht. Er bricht gegen Ende immer ab. Jetzt probier ich grad mal deinen Quelltext aus, bekomme aber den Fehler:

In die Übertragungsverbindung können keine Daten geschrieben werden: Eine bestehende Verbindung wurde softwaregesteuert
durch den Hostcomputer abgebrochen.

Kannst du dir das ebend mal anschauen? Ich versuch das schon so ewig.

Hier mein Quelltext:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
        public bool upload(string path)
        {

            string temppath = Application.StartupPath + "\\temp\\" + getmd5(path) + ".mp3";

            string hostname = "http://xxx.xxx.de";

            string divider = "---------------------------24464570528145";
            string header = "";

            String uploadfile = "--" + divider + "\r\nContent-Disposition: form-data; name=\"file\"; filename=\"" + getmd5(path) + ".mp3" + "\"\r\n\r\n";

            StringBuilder postvars = new StringBuilder("\r\n--" + divider + "\r\nContent-Disposition: form-data; name=\"field_1\"\r\n\r\ncontent_field_1\r\n");
            postvars.Append("--" + divider + "\r\nContent-Disposition: form-data; name=\"field_2\"\r\n\r\ncontent_field_2\r\n");
            string s = "\r\n" + divider + "--\r\n";

            int filesize = (int)new FileInfo(temppath).Length;

            int length = uploadfile.Length + postvars.Length + s.Length + filesize;
            header = "POST /upload.php HTTP/1.0\r\nHost: " + hostname + "\r\nUser-Agent: NNUPloader\r\nContent-Type: multipart/form-data; boundary=" + divider + "\r\nContent-Length: " + length + "\r\n\r\n";

            string input = "";
            using (TcpClient client = new TcpClient())
            {
                client.Connect(hostname, 80);
                client.SendBufferSize = 8192;
                using (NetworkStream stream = client.GetStream())
                {
                    byte[] bytes = Encoding.UTF8.GetBytes(postvars + s);
                    byte[] buffer = Encoding.UTF8.GetBytes(header + uploadfile);

                    stream.Write(buffer, 0, buffer.Length);

                    foreach (byte b in buffer)
                    {
                        char singleChar = Convert.ToChar(b);
                        Debug.Write(singleChar.ToString());
                    }

                    using (FileStream stream2 = new System.IO.FileInfo(temppath).OpenRead())
                    {
                        byte[] buffer3 = new byte[10000];
                        int count = 10000;
                        int num6 = 0;
                        while ((num6 = stream2.Read(buffer3, 0, count)) > 0)
                        {
                            stream.Write(buffer3, 0, num6);
                            System.Console.Write(".");
                            /*foreach (byte b in buffer3)
                            {
                                char singleChar = Convert.ToChar(b);
                                Debug.Write(singleChar.ToString());
                            }*/

                        }
                        stream.Write(bytes, 0, bytes.Length);

                        foreach (byte b in bytes)
                        {
                            char singleChar = Convert.ToChar(b);
                            Debug.Write(singleChar.ToString());
                        }
                        input = new StreamReader(stream).ReadToEnd();
                    }
                    stream.Close();
                }
                return true;
            }
}


Die Datei, die das empfangen soll lautet auch upload.php