Daten Empfangen im Netzwerk



  • Hallo zusammen,
    ich habe folgendes Problem:
    Ich habe einen Java-Server und C-Clients. Der Server schickt den Clients nun einen Datenstring. Da dieser jedoch immer unterschiedlich gross ist habe ich keine Ahnung wie viel Speicher ich beim Client benötige.
    Gibt es eine möglichkeit den Speicher dynamisch zu allozieren, sprich genau so viel wie benötigt wird?

    Danke



  • Ja, gibt es - nennt sich malloc() (natürlich solltest du vorher herausgefunden haben, wieviele Daten denn nun kommen werden).



  • mach' doch den speicher einfach so gross wie die mögliche maximallänge der strings.
    oder kann der string richtig gross sein (einige megabytes)?



  • Und was wäre die möglichkeit das vorher herauszufinden?
    Ich lese ja die Daten direkt sobald ich die Verbindung geöffnet habe, kann ich da wärend des lesens noch was drehen?



  • Du gibst typsicherweise beim Lesen an, wieviel Platz du hast (was darüber hinausgeht, sollte im Zwischenpuffer warten, bis du weiterliest). Also entweder liest du stückchenweise, bis du eine EOT-Antwort bekommst oder du überträgst als erstes die Länge der ankommenden Nachricht (in einer konstanten Größe):

    //Pseudocode:
    //a:
    char data[100];
    while(recv(s,data,100)!=-1)
    {
      //verarbeite Block
    }
    
    //b:
    int data_len,char* data;
    recv(s,data_len,sizeof(int));
    data=malloc(data_len);
    recv(s,data,data_len);
    


  • realloc()



  • CStoll schrieb:

    recv(s,data_len,sizeof(int));
    

    Java VMs benutzen 'big endian' und ein 'int' besteht dort aus 4 bytes.
    🙂



  • Wie gesagt - Pseudocode. Du mußt natürlich selber dafür sorgen, daß du die Daten richtig erkennst 😉



  • vista schrieb:

    CStoll schrieb:

    recv(s,data_len,sizeof(int));
    

    Java VMs benutzen 'big endian' und ein 'int' besteht dort aus 4 bytes.
    🙂

    Na ich hoffe doch, dass in Java die Größe des Ints auch vom darunterliegenden Betriebssystem abhängt (so wie in C). D.h. 16Bit-System = 2 Byte, 32Bit-System = 4 Byte, 64Bit-System = 8 Byte, ...



  • AJ schrieb:

    vista schrieb:

    CStoll schrieb:

    recv(s,data_len,sizeof(int));
    

    Java VMs benutzen 'big endian' und ein 'int' besteht dort aus 4 bytes.
    🙂

    Na ich hoffe doch, dass in Java die Größe des Ints auch vom darunterliegenden Betriebssystem abhängt (so wie in C). D.h. 16Bit-System = 2 Byte, 32Bit-System = 4 Byte, 64Bit-System = 8 Byte, ...

    Nana, ganz so einfach ist es nun auch nicht 😉



  • AJ schrieb:

    Na ich hoffe doch, dass in Java die Größe des Ints auch vom darunterliegenden Betriebssystem abhängt (so wie in C). D.h. 16Bit-System = 2 Byte, 32Bit-System = 4 Byte, 64Bit-System = 8 Byte, ...

    nein, der java-user soll sich darauf verlassen können, dass variablen für immer und alle zeiten und auf allen java VMs die gleiche grösse und byte order haben.
    🙂



  • vista schrieb:

    nein, der java-user soll sich darauf verlassen können, dass variablen für immer und alle zeiten und auf allen java VMs die gleiche grösse und byte order haben.
    🙂

    Heißt das, dass Java für immer und alle Zeiten nur mit 32Bit zurecht kommt??



  • AJ schrieb:

    Heißt das, dass Java für immer und alle Zeiten nur mit 32Bit zurecht kommt??

    für grössere integers hat java 'long', der besteht aus 8 bytes.
    🙂



  • vista schrieb:

    AJ schrieb:

    Heißt das, dass Java für immer und alle Zeiten nur mit 32Bit zurecht kommt??

    für grössere integers hat java 'long', der besteht aus 8 bytes.
    🙂

    Nur dumm, wenn vielleicht doch mal noch ein Betriebssystem rauskommt, dass auf 128Bit basiert... 😉

    Na zumindest die Referenzen müssen mitwachsen mit dem darunterliegenden System.


Log in to reply