Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++ (auch C++0x und C++11) ::  Eine Frage zum Vector     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
_mat_
Unregistrierter




Beitrag _mat_ Unregistrierter 11:25:21 09.08.2012   Titel:   Eine Frage zum Vector            Zitieren

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:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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.
_mat_
Unregistrierter




Beitrag _mat_ Unregistrierter 11:30:40 09.08.2012   Titel:              Zitieren

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

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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;
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 17928
Beitrag SeppJ Moderator 11:31:55 09.08.2012   Titel:              Zitieren

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


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

_________________
Du brauchst Hilfe?, Buchempfehlungen für C++,
Wie man in Fragen den richtigen Code postet,
The Definitive C++ Book Guide and List
_mat_
Unregistrierter




Beitrag _mat_ Unregistrierter 11:58:07 09.08.2012   Titel:              Zitieren

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


:confused:

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

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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;
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 17928
Beitrag SeppJ Moderator 12:12:30 09.08.2012   Titel:              Zitieren

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

_________________
Du brauchst Hilfe?, Buchempfehlungen für C++,
Wie man in Fragen den richtigen Code postet,
The Definitive C++ Book Guide and List
_mat_
Unregistrierter




Beitrag _mat_ Unregistrierter 13:06:37 09.08.2012   Titel:              Zitieren

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?

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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?
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 17928
Beitrag SeppJ Moderator 13:14:46 09.08.2012   Titel:              Zitieren

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!
Zitat:

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.

_________________
Du brauchst Hilfe?, Buchempfehlungen für C++,
Wie man in Fragen den richtigen Code postet,
The Definitive C++ Book Guide and List


Zuletzt bearbeitet von SeppJ am 13:18:01 09.08.2012, insgesamt 1-mal bearbeitet
_mat_
Unregistrierter




Beitrag _mat_ Unregistrierter 13:43:54 09.08.2012   Titel:              Zitieren

Ich glaub ich hab es geschafft:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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?
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 17928
Beitrag SeppJ Moderator 14:49:07 09.08.2012   Titel:              Zitieren

_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.

_________________
Du brauchst Hilfe?, Buchempfehlungen für C++,
Wie man in Fragen den richtigen Code postet,
The Definitive C++ Book Guide and List
_mat_
Unregistrierter




Beitrag _mat_ Unregistrierter 15:24:01 09.08.2012   Titel:              Zitieren

In meinem Fall geht es um das versenden von Emails und das hochladen von Dateien.
Alles über das HTTP-Protokoll.
c++.de :: C++ (auch C++0x und C++11) ::  Eine Frage zum Vector   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.