| Autor |
Nachricht |
_mat_
Unregistrierter
|
_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
|
_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
|
SeppJ Moderator
11:31:55 09.08.2012 Titel: |
|
Zitieren |
|
 |
_mat_
Unregistrierter
|
_mat_ Unregistrierter
11:58:07 09.08.2012 Titel: |
|
Zitieren |
| Zitat: | C/C++ Code:
vector<char>ans(1);
Nimm doch einfach einen char! |
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
|
SeppJ Moderator
12:12:30 09.08.2012 Titel: |
|
Zitieren |
|
 |
_mat_
Unregistrierter
|
_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
|
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
|
_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
|
SeppJ Moderator
14:49:07 09.08.2012 Titel: |
|
Zitieren |
|
 |
_mat_
Unregistrierter
|
_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. |
|
|
|
 |
|
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.
|
|
|
|
|