none
TCP IP Server mit IAsyncResult RRS feed

  • Frage

  • Hallo!

    Das ist der von Microsoft zur Verfügung gestellte Code für den Empfang Link:

     public static void ReadCallback(IAsyncResult ar) {  
            String content = String.Empty;  
    
            // Retrieve the state object and the handler socket  
            // from the asynchronous state object.  
            StateObject state = (StateObject) ar.AsyncState;  
            Socket handler = state.workSocket;  
    
            // Read data from the client socket.   
            int bytesRead = handler.EndReceive(ar);  
    
            if (bytesRead > 0) {  
                // There  might be more data, so store the data received so far.  
                state.sb.Append(Encoding.ASCII.GetString(  
                    state.buffer,0,bytesRead));  
    
                // Check for end-of-file tag. If it is not there, read   
                // more data.  
                content = state.sb.ToString();  
                if (content.IndexOf("<EOF>") > -1) {  
                    // All the data has been read from the   
                    // client. Display it on the console.  
                    Console.WriteLine("Read {0} bytes from socket. \n Data : {1}",  
                        content.Length, content );  
                    // Echo the data back to the client.  
                    Send(handler, content);  
                } else {  
                    // Not all data received. Get more.  
                    handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,  
                    new AsyncCallback(ReadCallback), state);  
                }  
            }  
        }  

    Der Codeteil: 

    state.sb.Append(Encoding.ASCII.GetString(  
                    state.buffer,0,bytesRead));  

    ist für mich ein Problem. Ich nutze eine List<byte[]> und füge anstatt Text, die Empfangenen byte-Arrays zu...

    byteList.add(state.buffer);

    Nun, es spielt keine Rolle ob die byteList in dem state-Object selbst ist, oder ob sie im Codebehind irgendwo sitzt, es ist "immer" das ByteArray des "letzten" Empfangs in der Liste. Läuft also das Empfangen 3 mal durch, da die Daten so groß sind, sind in der Liste zwar 3 Arrays, aber alle mit selben Inhalt, nämlich des zuletz Empfangenen.

    Was mache ich falsch?

    Gruß, Flo


    FLOGERSOFT.de - Top Apps, wie z.B. 'Die Taschenlampe' oder ganz neu dabei: 'LiveClock' die Echtzeituhr für ihre Windows Phone Live-Kachel - mit Wettervorhersage!

    Dienstag, 15. Mai 2018 16:32

Antworten

Alle Antworten

  • Hallo Flo,

    Sieh Dir die in diesem Codebeispiel definierte Methode ReceiveCallback an, insbesondere das Befüllen der Liste (incommingBytes), das Aufrufen der Thread.Sleep()-Methode und die UTF8-Codierung. Hoffentlich hilft es Dir weiter.

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 16. Mai 2018 13:54
    Administrator
  • Bedingt.

    Wenn ich die byte-Arrays anstatt in eine Liste in ein Memorystream schreibe, klappt es allerdings!

    Gruß Flo


    FLOGERSOFT.de - Top Apps, wie z.B. 'Die Taschenlampe' oder ganz neu dabei: 'LiveClock' die Echtzeituhr für ihre Windows Phone Live-Kachel - mit Wettervorhersage!

    Samstag, 19. Mai 2018 06:49