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 (C89, C99 und C11) ::  Binärdaten über Sockets empfangen?  
Gehen Sie zu Seite Zurück  1, 2, 3, 4  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
EOP
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.09.2007
Beiträge: 809
Beitrag EOP Mitglied 23:01:59 24.02.2012   Titel:              Zitieren

Zitat:
int amount ) //warum denn int?
Weil recv einen int liefert.

Zitat:
char *tmp = new char[m_data_size+amount+1]; //aua
Was ist hier denn schon wieder aua?

Zitat:
if( !tmp ) //new gibt nicht 0 zurück
Die Kritik daran hab ich erwartet und akzeptiere ich.

Ansonsten schreibe ich seit über 20 Jahren Programme, die auch ohne exceptions fehlerfrei funktionieren.

Problem war: ich musste in einem download beliebiger Größe nach mehreren Schlüsselwörtern suchen:
- Download nach Schlüsselwort durchsuchen
- wenn Schlüsselwort nicht gefunden, download - (Länge des längsten Schlüsselworts - 1) speichern und weiter

Und wie würde ich einen vector<char> nach Schlüsselwörtern durchsuchen?
TyRoXx
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.06.2009
Beiträge: 1040
Beitrag TyRoXx Mitglied 23:20:02 24.02.2012   Titel:              Zitieren

EOP schrieb:
Zitat:
int amount ) //warum denn int?
Weil recv einen int liefert.

Was hat recv denn mit CCharBuffer zu tun? Genau, gar nichts!

EOP schrieb:

Zitat:
char *tmp = new char[m_data_size+amount+1]; //aua
Was ist hier denn schon wieder aua?

Dein Steinzeit-Compiler kennt anscheinend vector nicht oder du bist noch verkalkter als jener.

EOP schrieb:

Zitat:
if( !tmp ) //new gibt nicht 0 zurück
Die Kritik daran hab ich erwartet und akzeptiere ich.

.. wenn nackte Tatsachen nichts mehr ausrichten können.

EOP schrieb:

Ansonsten schreibe ich seit über 20 Jahren Programme, die auch ohne exceptions fehlerfrei funktionieren.

Das ist jetzt nicht dein Ernst, oder?

EOP schrieb:

Und wie würde ich einen vector<char> nach Schlüsselwörtern durchsuchen?

Das ist nicht mehr komisch, du kannst aufhören.

_________________
.. aber dann wäre C++ uneinheitlich und nicht mehr so anfängergerecht.


Zuletzt bearbeitet von TyRoXx am 23:20:39 24.02.2012, insgesamt 1-mal bearbeitet
EOP
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.09.2007
Beiträge: 809
Beitrag EOP Mitglied 23:36:57 24.02.2012   Titel:              Zitieren

Was bist du denn für ein Depp? Nur Gemecker aber nix Konstruktives von dir. Absolut nix.

Zitat:
Und wie würde ich einen vector<char> nach Schlüsselwörtern durchsuchen?
Antworte bitte.


Zuletzt bearbeitet von EOP am 23:38:27 24.02.2012, insgesamt 1-mal bearbeitet
rüdiger
Moderator

Benutzerprofil
Anmeldungsdatum: 11.07.2001
Beiträge: 23069
Beitrag rüdiger Moderator 23:37:21 24.02.2012   Titel:              Zitieren

In C gibt es weder vector<char> noch new char[...]. Also wenn du Fragen zu vector<char> hast, dann stell sie bitte im C++-Forum. Die ganze Diskussion ist sicher wenig hilfreich für den Op.
EOP
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.09.2007
Beiträge: 809
Beitrag EOP Mitglied 23:39:26 24.02.2012   Titel:              Zitieren

rüdiger schrieb:
In C gibt es weder vector<char> noch new char[...]. Also wenn du Fragen zu vector<char> hast, dann stell sie bitte im C++-Forum. Die ganze Diskussion ist sicher wenig hilfreich für den Op.
Dann nimm eben malloc und free.
rüdiger
Moderator

Benutzerprofil
Anmeldungsdatum: 11.07.2001
Beiträge: 23069
Beitrag rüdiger Moderator 01:10:26 25.02.2012   Titel:              Zitieren

EOP schrieb:
rüdiger schrieb:
In C gibt es weder vector<char> noch new char[...]. Also wenn du Fragen zu vector<char> hast, dann stell sie bitte im C++-Forum. Die ganze Diskussion ist sicher wenig hilfreich für den Op.
Dann nimm eben malloc und free.


realloc. Aber selbst dann hat dein Code noch die angesprochenen Probleme und vorallem auch eine schlechte Allokierungsstrategie. Sobald du einmal die Kapazität erreicht hast, hast du dann ein realloc pro recv!
EOP
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.09.2007
Beiträge: 809
Beitrag EOP Mitglied 02:20:20 25.02.2012   Titel:              Zitieren

rüdiger schrieb:
EOP schrieb:
rüdiger schrieb:
In C gibt es weder vector<char> noch new char[...]. Also wenn du Fragen zu vector<char> hast, dann stell sie bitte im C++-Forum. Die ganze Diskussion ist sicher wenig hilfreich für den Op.
Dann nimm eben malloc und free.


realloc. Aber selbst dann hat dein Code noch die angesprochenen Probleme und vorallem auch eine schlechte Allokierungsstrategie. Sobald du einmal die Kapazität erreicht hast, hast du dann ein realloc pro recv!
Das war ja nur ein Teil einer Klasse um irgendeine binäre Geschichte zu lösen.

Sobald keins der Schlüsselwörter gefunden wurde, wird der Puffer (minus Länge des längsten Schlüsselworts - 1) geschrieben, Rest an den Anfang verschoben und wiederverwendet.
Nix mit ständigem realloc.

Außerdem lese ich nie mehr als der Puffer groß ist. Da gibt's höchstens am Anfang mal ein "realloc".
Würde ich den Puffer von Anfang an mit (Größe x + Länge des längsten Schlüsselworts) allozieren und nur immer Größe x lesen, gäb's eigentlich nie ein realloc.
cooky451
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.10.2010
Beiträge: 6926
Beitrag cooky451 Mitglied 19:52:27 25.02.2012   Titel:              Zitieren

EOP schrieb:
Und wie würde ich einen vector<char> nach Schlüsselwörtern durchsuchen?
Ist das deine Vorstellung von seit 20 Jahren programmieren? :eek:
Egal wie du vorher nach Schlüsselwörtern gesucht hast, mit dem vector wird es letztlich genau so funktionieren.

@TE
Eine einfache Möglichkeit ist, den empfangenen Puffer immer gleich in eine Datei zu schreiben. Dann musst du dich um das malloc/realloc Gefrickel nicht kümmern.

_________________
Sie sind nicht berechtigt unrechtmäßige Kopien dieses Datenträgers zu erstellen.™
Keksverteilungsbeauftragter
Wutz
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.04.2010
Beiträge: 2705
Beitrag Wutz Mitglied 21:17:37 25.02.2012   Titel:   Re: Binärdaten über Sockets empfangen?            Zitieren

BlackCubeX schrieb:
Hey,
wie der Titel schon sagt arbeite ich an einem einfachen HTTP 1.0 Client, habe aber Probleme mit Binärdaten. Textdateien lassen sich einfach über
C++:
    do {
        count = recv( sock, buffer, sizeof(buffer), 0);
        strcat(content, buffer);
    }
    while (count > 0);

empfangen.
Wenn ich aber nun z.B. ein PNG anfordere und in eine Datei schreibe, ist diese nicht lesbar.

Wie du schon richtig erkannt hast, kann das für Binärdateien nicht funktionieren, da strcat verwendet wird, was nur Strings richtig verarbeitet.

C++:
1
2
3
4
5
6
7
8
unsigned char buffer[1024],*b=0;
size_t p=0;
while( (count = recv( sock, buffer, 1024, 0))>0 )
{
  b=realloc(b,p+count);
  memcpy(b+p,buffer,count);
  p+=count;
}

_________________
Java, the best argument for Smalltalk since C++. -- Frank Winkler


Zuletzt bearbeitet von Wutz am 21:35:38 25.02.2012, insgesamt 2-mal bearbeitet
EOP
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.09.2007
Beiträge: 809
Beitrag EOP Mitglied 22:01:55 25.02.2012   Titel:              Zitieren

cooky451 schrieb:
EOP schrieb:
Und wie würde ich einen vector<char> nach Schlüsselwörtern durchsuchen?
Ist das deine Vorstellung von seit 20 Jahren programmieren? :eek:
Das ist nicht meine Vorstellung sondern die Realität.

Außerdem liebe ich memcpy, memmove, etc. :leak:
c++.de :: C (C89, C99 und C11) ::  Binärdaten über Sockets empfangen?  
Gehen Sie zu Seite Zurück  1, 2, 3, 4  Weiter
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.