C#, stream bis zum ende lesen



  • hi!

    ich gerade beim einsteigen in C# und habe folgendes problem:

    ich will eine mail von einem pop3 server abrufen, die verbindung steht schon auch den befehl zum abrufen der mail hab ich schon geschickt mit:

    data = System.Text.Encoding.ASCII.GetBytes("RETR 1\n");
    popStream.Write(data, 0, data.Length); /*popStream ist ein NetworkStream*/
    

    und dann bekomm ich auch eine antwort vom server aber nie kann ich den ganzen stream auslesen! wie wuerdet ihr das machen?

    ich habs so gemacht:

    do{
      /*popStream ist ein NetworkStream; bytes ist ein Int32; mailData ist ein bytearray*/
      bytes = popStream.Read(mailData, 0, mailData.Length);
      backData += System.Text.Encoding.ASCII.GetString(mailData, 0, bytes);
      Console.Write(backData + "\n");
    }while(popStream.DataAvailable);
    

    waer super waenn ihr mir da weiterhelfen koenntet!!

    danke!



  • Da Daten ja wegen Netzwerkauslastungen und oder Serverauslastungen asynchron
    über die Datenleitung kommen können wäre BeginRead-Methode interessant fuer Dich.

    Deine Streaminstanz sollte darüber verfügen.

    Gruss sclearscreen



  • --linuxuser-- schrieb:

    und dann bekomm ich auch eine antwort vom server aber nie kann ich den ganzen stream auslesen!

    Warum nicht?



  • hi!

    ich hab erst jetzt wieder zeit gefunden an meinem mail prog weiterzuprogrammieren und es ist so ich hab das mit dem asynchrounous read nun gemacht:

    /*check if the stream is readable*/
    				if(popStream.CanRead){
    					/*start the asynchrounous read*/
    					IAsyncResult x = popStream.BeginRead(mailData, 0, mailData.Length, callBack, popStream);
    
    					/*stop the asynchrounous read*/
    					bytes = popStream.EndRead(x);
    
    					/*get the mail into a string*/
        				backData = System.Text.Encoding.ASCII.GetString(mailData, 0, bytes);
    
        				popStream.Flush();/*habs mit und ohne dieser zeile probiert ist bei beiden malen das selbe ergebnis*/
    				}else{
    					mailbox.setErrorMsg("Es wurde nichts zum lesen freigegeben!");
    					return mailbox;
    				}
    

    aber leider will das ding nicht so richtig die erste mail wird sauber empfangen aber dann kommen nur noch kleiner stuecke an... ich weis nicht woran das liegt...

    mein algorythmus sieht so aus:

    melde dich an; /*das funkt*/
    hohle dir die anzahl der verfuegbaren mails; /*das funkt*/
    solange mails auf dem server mache folgendes:
       sende an server:"RETR " + (aktueller schleifendurchlauf + 1) + "\n"); /*funkt*/
       fuehre den oben angegebenen code aus...
       speichere das mail in eine ArrayList/*funkt*/
    alle mails abgerufen
    

    tja soweit hab ichs eben schon implementiert aber waenn ich die arraylist dann durchlaufe wo ich meine mail gespeichert habe ist eben nur die erste mail drinnen und dann sind so kleine stuecken alla:

    -----------------------------------------------------------------------------------------
    
    See the
    <br><a href="http://www.gnu.org/copyleft/gpl.html">http://www.gnu.org/copyleft/gpl.html</a> for more details.
    
    ------=_Part_11737_27039501.1154707468033--
    
    .
    
    -----------------------------------------------------------------------------------------
    

    usw

    kann mir da einer weiterhelfen?

    danke!

    mfg --linuxuser--



  • Ich vermag nicht zu erkennen, was das genaue Problem ist. Du implementierst wohl das POP3-Protokoll. Ob du das richtig machst, kann ich nicht entscheiden. Deine ursprüngliche Frage war ja nur, wie du bis zum Ende eines Streams lesen kannst. Ein Netzwerkstream geht dann allmählich zu Ende, wenn einer der beiden Partner die Verbindung schließt.

    Wenn keine Daten kommen (weil der andere nichts sendet) passiert erstmal nichts, auch kein Stream-Ende. Wenn nichts kommt und du machst ein Read, dann blockiert der aktuelle Thread so lange, bis doch mal was kommt. Kann sein, dass der Server auf ein Paket von dir wartet und so lange selber nichts an dich sendet und du dich deshalb zu Tode hängst.

    Aber so kann man dir nicht helfen. 😉 Erst schreibst du, du kannst den Stream nicht zu Ende lesen, sagst aber nicht warum. Dann erzählst du was von einer ArrayList (die man hier nicht sieht) und sagst, da ist nur eine Mail drin, wo viele drin sein sollten. Kein Mensch weiß jetzt, ob du überhaupt POP3 richtig implementiert hast und ob nicht das dein eigentliches Problem ist, oder ob du nur ein technisches Problem mit deiner Stream I/O hast.

    Ich kann dir nur eines mit Gewissheit sagen:

    /*start the asynchrounous read*/
                        IAsyncResult x = popStream.BeginRead(mailData, 0, mailData.Length, callBack, popStream);
    
                        /*stop the asynchrounous read*/
                        bytes = popStream.EndRead(x);
    

    Ist völlig nutzlos. Du startest einen asynchronen Read, machst dazwischen nichts und wartest dann auf das Ende vom Read. Im Endeffekt war dadurch gar nichts asynchron und du hättest direkt Read() verwenden können.





  • hi!

    danke habs hinbekommen waenn ich zwischen jedem mailempfang ein sleep reintue dann gehts komischerweise 😮 😕

    danke!


Anmelden zum Antworten