byte array größe (socket)



  • Hallo,

    Und zwar bin ich gerade ein wenig überfragt was das Byte Array angeht in der Initialisierung.
    Ich brauche ja ein Byte Array für das empfangen von Daten für socket.Receive.
    Und jetzt zu mein Problem, ich will das das Array immer so groß ist, was auch ankommt über Receive.
    Aber kann ich denn das Byte array vorher schon mit der größe von socket.Receive defenieren wenn noch keine Nachricht ankommt?
    normal nicht oder?
    da ich das Array vorher schon zuweisen muss bevor ich nutze, frage ich mich wie man das so macht, damit sich die größe an socket.ReceiveBufferSize richtet?

    byte[] buffE = new byte[socket.ReceiveBufferSize];
    int RecByte = socket.Receive(buffE);
    

    geht nicht oder?

    Gruß



  • b4nan1 schrieb:

    Aber kann ich denn das Byte array vorher schon mit der größe von socket.Receive defenieren wenn noch keine Nachricht ankommt?

    Wenn noch keine Nachricht angekommen ist, kannst du ja auch nicht wissen wie groß sie sein wird.

    byte[] buffE = new byte[socket.ReceiveBufferSize];
    int RecByte = socket.Receive(buffE);
    

    [/quote]
    Geht, tut aber nicht was du vermutest. Lies nach was ReceiveBufferSize ist.



  • Ja das gibt mir die Größe zurück was angekommen ist in typ int!

    PS: Ich weiss das es nicht, daher frage ich hier ja, wie man es machen kann damit es funktioniert wie ich es möchte, da ich das Array keine feste größe geben möchte, da text und bilder etc geschickt werden!
    Ich frage mich sowieso warum er nicht meckert wenn ich das Array mit der rec..size defeniere, da ja normalerweise nur const akzeptiert wird oder? bzw eine feste zahl? so ist das doch bei C++, und hier ändert sich ja die größe immer, und er sagt nicht mal einen Fehler was das angeht 0o.

    Also kann man in C# die größe immer ändern, und in C nicht?



  • So ich habe es gerade selbst hinbekommen wie ich es haben möchte:
    Mal schauen wie lange es so geht wie ich es mir denke.

    private static byte[] buffE;
    
            public static byte[] createbuffer(int size)
            {
                buffE = new byte[size];
                return buffE;
            }
    
            int RecByte = socket.Receive(createbuffer(socket.ReceiveBufferSize));
    


  • b4nan1 schrieb:

    Ja das gibt mir die Größe zurück was angekommen ist in typ int!

    Und das stimmt einfach nicht. Es ist die größe des internen Receivebuffers. Deshalb -> Nachlesen und nicht wild rumraten.



  • b4nan1 schrieb:

    PS: Ich weiss das es nicht, daher frage ich hier ja, wie man es machen kann damit es funktioniert wie ich es möchte, da ich das Array keine feste größe geben möchte, da text und bilder etc geschickt werden!

    Socket transportieren nur byte-Ströme. Die wissen nicht wieviele Daten kommen, das ist DEINE Aufgabe es in einem Protokoll festzulegen. Das Protokoll kann erstmal die Länge der Nachricht und dann die Nutzdaten senden, nur als Beispiel. Dann wüsstest Du auch welche Größe das byte-Array haben sollte.

    b4nan1 schrieb:

    Ich frage mich sowieso warum er nicht meckert wenn ich das Array mit der rec..size defeniere, da ja normalerweise nur const akzeptiert wird oder? bzw eine feste zahl? so ist das doch bei C++, und hier ändert sich ja die größe immer, und er sagt nicht mal einen Fehler was das angeht 0o.

    Also kann man in C# die größe immer ändern, und in C nicht?

    Die Größe muss keine konstante sein. Genau so wenig wie es in C oder C++ bei dynamisch allozierten Arrays der Fall ist. Du hast heftige Lücken bei den Grundlagen, lies besser nochmal ein Anfängerbuch vor der Netzwerkprogrammierung.



  • Richtig würde ich alles wissen würde ich ja hier nicht fragen 🙂
    Und bei MSDN Steht das die Eigenschaft davon ist, um die buffergröße zu ermitteln, oder diese damit fest zu legen!
    Also was ist daran falsch, wenn ich sage, ich möchte damit meine buffer size danach richten?
    Was mir den wert in int zurück gibt, und das Array einen index von type int erwartet, ist doch mein vorhaben und wissen drüber doch richtig, oder willst du mir jetzt sagen das stimmt absolut nicht?



  • die socket-klasse verwendet intern einen buffer um ankommende bytes zwischenzuspeichern. ReceiveBufferSize ist die größe dieses buffers und per default 8192 bytes groß. immer. bei jeder nachricht. die größe hat nichts mit den aktuell empfangenen bytes zu tun.

    kodiere deine nachrichtengrößen per protokoll (länge gefolgt von nutzdaten oder einfach nur end-symbole für jede nachricht).
    und ja, deine vorgehensweise ist falsch. oder was passiert wohl wenn eine nachricht (z.b. bild) mit mehr als ReceiveBufferSize bytes empfangen werden soll?



  • hmm
    Also das Bild kommt auch immer an, auch wenn davor ein string ankommt, der nicht die größe des buffers hatte.
    Also noch funktioniert alles so, es kommen string ketten an, und zwischendurch halt bilder wenn ich die anfordere vom Server etc..
    Also der buffer war bis jetzt noch nicht zu klein.



  • Ich glaube auch nur das es wegen der Funktion noch funktioniert:

    public static byte[] createbuffer(int size) 
             { 
                 buffE = new byte[size]; 
                 return buffE; 
             }
    


  • Aber danke für deinen Hinweis, ich werde das heute abaned mal im debug beobachten was er mit der größe etc.. alles macht, wenn ein bild und dann ein string ankommt.

    ggf passe ich das dann noch an.



  • warum ignorierst du ständig meinen hinweis auf ein protokoll? du hast eine falsche vorstellung davon was sockets sind.

    du kannst auch jedesmal nur ein byte mit Receive in einen buffer schreiben und per schleife deine nachrichten zusammenbauen (nicht effizient aber ich will den punkt verdeutlichen).

    nunja ich klinke mich mal aus hier. habe nun dreimal gesagt was wesentlich ist, der rest liegt bei dir.


Anmelden zum Antworten