Eine Frage zum Vector



  • Hallo, ich lese hier Daten in einen Vector ein welche ich Empfangen habe.
    Mein Vector hat hier ja eine Statische größe von 30 Byte und ich lese hier immer Datenpakete mit einer größe von Maximal 10 Byte ein.

    Beispiel 1:

    int rc; // recv gibt die Anzahl der empfangenen Bytes zurück
    
    vector<char>ans(30);
    int TotalReceivedBytes=0;
    do
    {
    rc = recv(client,&ans [TotalReceivedBytes],10,0);
    
            if ( rc > 0 )
            {
                cout<<"Gelesene Bytes: " << rc << endl;   // 10
    
                TotalReceivedBytes = rc + TotalReceivedBytes;
                cout<<"Ausgabe: " << ans[ TotalReceivedBytes -1 ]<<endl;
    
            }
    
            if (rc==0)
            {
               cout<<"Server hat die Verbindung getrennt.."<<endl;
               system("PAUSE");
               return 0;
            }
            if (rc==SOCKET_ERROR)
            {
                    cout<<"SOCKET_ERROR"<<endl;
                    system("PAUSE");
                    return 0;
            }
    
    }
    while( ans[ TotalReceivedBytes-1 ] != 'X' );
    cout<<"--> " << &ans[0] << endl;
    

    Hier lese ich immer nur Datenpakete bis maximal 1 Byte ein.
    Das Empfangene Paket pushe ich in einen Vector.

    Ich denke mal ich kann so oft push_back machen bis mein Arbeitsspeicher voll ist bzw. bei einem 32Bit Prozess bis max 4 GB ( Win 32). (Ist das richtig?)

    Beispiel 2:

    int rc; // recv gibt die Anzahl der empfangenen Bytes zurück
    
    vector<char>ans(1);
    vector<char>Buffer;
    
    int TotalReceivedBytes=0;
    
    int j=0;
    do
    {
    rc = recv(client,&ans [0], 1 ,0);
    
            if ( rc > 0 )
            {
                TotalReceivedBytes = rc + TotalReceivedBytes;
                Buffer.push_back( ans[0] );
                j++;
            }
    
            if (rc==0)
            {
               cout<<"Server hat die Verbindung getrennt.."<<endl;
               system("PAUSE");
               return 0;
            }
            if (rc==SOCKET_ERROR)
            {
                    cout<<"SOCKET_ERROR"<<endl;
                    system("PAUSE");
                    return 0;
            }
    
    }
    while( Buffer[j-1] != 'X' );
    
    Buffer[TotalReceivedBytes] = '\x00';
    cout<<"--> " << &Buffer[0] << endl;
    

    Worauf ich hinauswill ich lese in Beispiel 2 ja immer nur 1 Byte ich würde jedoch gerne 10 Byte jedes mal lesen und trotzdem nicht auf die push_back Funktion verzichten sodass ich also jedes mal 10 Byte lese und diese dann in den Vector pushe.



  • Wenn es mit dem push_back nicht geht dann würde ich es wohl mit string und append machen:

    vector<char>ans(10);
    string dbg;
    do
    {
    rc = recv(client,&ans[0],10,0);
    
            if ( rc > 0 )
            {
                cout<<"Gelesene Bytes: " << rc << endl;
                ans[rc]='\x00';
                dbg.append(  &ans[0] );
    
            }
    
            if (rc==0)
            {
               cout<<"Server hat die Verbindung getrennt.."<<endl;
               system("PAUSE");
               return 0;
            }
            if (rc==SOCKET_ERROR)
            {
                    cout<<"SOCKET_ERROR"<<endl;
                    system("PAUSE");
                    return 0;
            }
    
    }
    while( ans[ rc - 1 ] != 'X' );
    
    cout<<"--> " << dbg << endl;
    

  • Mod

    Vergrößere den Empfangspuffer um die erwarteten 10 Elemente, dann gibst du der Lesefunktion die Adresse des ersten neu erstellten Elements.

    vector<char>ans(1);
    

    Nimm doch einfach einen char!



  • C/C++ Code:
    vector<char>ans(1);
    Nimm doch einfach einen char!

    😕

    Das passt doch gar nicht, ich glaub ich hab dich irgendwie missverstanden ...

    int rc; // recv gibt die Anzahl der empfangenen Bytes zurück
    vector<char>ans(1);
    
    do
    {
    rc = recv(client,&ans [0], 1 ,0);
    
            if ( rc > 0 )
            {
    
                   ....
            }
    
    }
    while( Buffer[j-1] != 'X' );
    
    Buffer[TotalReceivedBytes] = '\x00';
    cout<<"--> " << &Buffer[0] << endl;
    

  • Mod

    char ans;
    // ...
    rc = recv(client, &ans, 1 ,0);
    


  • Aber so lese ich ja wieder nur Byte für Byte, ich wollte ja in 10 Byte blöcken lesen.

    Ich müsste an den Vector dbg die Daten aus dem Vector ans anhängen.
    Gibt es sowas wie append für Vector?

    vector<char>ans(10);
    vector<char>dbg;
    
    int TotalReceivedBytes=0;
    do
    {
    rc = recv(client,&ans[0],10,0);
    
            if ( rc > 0 )
            {
                cout<<"Gelesene Bytes: " << rc << endl;
                TotalReceivedBytes = rc + TotalReceivedBytes;
    
                dbg.resize( TotalReceivedBytes );
                dbg.append( ans ); //Gibts so nicht ..
    
            }
    
    }
    while( ans[ rc - 1 ] != 'X' );
    
    cout<<"--> " << &dbg[0] << endl;
    

    Btw. was ist eigentlich am Perfomantesten jedes Byte wirklich einzelt lesen und dann in einen Vector pushen oder immer direkt die Daten in Paketen von z.b. 100 Byte oder so lesen?


  • Mod

    Wie du mehr als 1 Byte lesen kannst, habe ich dir doch schon gesagt. Lies Antworten bitte genau! Das vector<char> ans(1) vs. char ans war doch nur ein Nebenschauplatz, der dir den Unsinn eines statischen Vectors mit Länge 1 zeigen sollte. Überhaupt sind kleine statische vectoren recht sinnlos. Es sieht so aus, als hättest du einmal vorgemacht bekommen hast, wie man in C++ in einen vector einliest und nun wandelst du das Kochrezept ab, ohne verstanden zu haben, wieso überhaupt ein vector benutzt wurde!

    Btw. was ist eigentlich am Perfomantesten jedes Byte wirklich einzelt lesen und dann in einen Vector pushen oder immer direkt die Daten in Paketen von z.b. 100 Byte oder so lesen?

    Kommt drauf an, woher die Zeichen kommen. In der Regel sind Blockoperationen wesentlich schneller.



  • Ich glaub ich hab es geschafft:

    int TotalReceivedBytes=0;
    vector<char>ans;
    int inc = 10; // Anzahl um die der Vector erhöht werden soll nachjedem Schleifen durchlauf
    
    do
    {
    ans.resize ( TotalReceivedBytes + inc );
    
    rc = recv(client,&ans [TotalReceivedBytes], inc ,0);
    
            if ( rc > 0 )
            {
                TotalReceivedBytes = rc + TotalReceivedBytes;
            }
    
    }
    while( ans[ TotalReceivedBytes-1 ] != 'X' );
    

    Eine Frage hab ich aber noch auhc wenn die hier nicht ganz hingehört.
    Welche Block größe ist den sinnvoll, ich mein soll ich 10 Byte aufeinmal einlesen oder doch lieber 100 Byte?


  • Mod

    mat schrieb:

    Welche Block größe ist den sinnvoll, ich mein soll ich 10 Byte aufeinmal einlesen oder doch lieber 100 Byte?

    Such dir eine der folgenden Antworten aus:
    1. Kommt drauf an.
    2. Probier es aus.
    🙂

    Ohne Hintergrundinformation kann man keine Optimierungsfragen beantworten. Es ist noch nicht einmal klar, was optimiert werden soll.



  • In meinem Fall geht es um das versenden von Emails und das hochladen von Dateien.
    Alles über das HTTP-Protokoll.


Anmelden zum Antworten