Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: Die Artikel ::  Sockets und das HTTP-Protokoll  
Gehen Sie zu Seite Zurück  1, 2, 3, 4, 5, 6, 7, 8, 9, 10
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
PtrPtr
Unregistrierter




Beitrag PtrPtr Unregistrierter 00:18:39 15.07.2011   Titel:              Zitieren

Artchi schrieb:
Die Kompressionsrate des JPEGs ist nur zu hoch. Man kann deshalb fast nichts erkennen. Ansonst hat das Bild irgendwie einen gewissen Charme. :D


Für eine derartige Grafik ist JPEG völlig ungeeignet. Am besten PNG.
PtrPtr
Unregistrierter




Beitrag PtrPtr Unregistrierter 00:21:32 15.07.2011   Titel:              Zitieren

Hab nochmal nachgeschaut, es ist schon, wie es sich gehört, ein PNG. :D
PlanloserCoder
Unregistrierter




Beitrag PlanloserCoder Unregistrierter 16:49:59 13.09.2011   Titel:   Recv will nicht ganz            Zitieren

Weiß jemand warum bei mir die recv Funktion nicht ganz geht? Also besser gesagt will ich das das er die While schleife verlässt wenn ein bestimmtes Zeichen im String vorliegt... das letzte Zeichen beim empfangen endet mit "]", dennoch läuft die schleife weiter auch wenn ich (c == ']') in den Funktion schreibe. Die Text Datei wird ohne Zeichen einfach weiter gefüllt da recv nicht gestoppt wird. Weiß jemand woran das liegt oder wie ich am besten aus der while schleife raus komme wenn das letzte zeichen ein "]" ist, so das mein Programm nach empfangen aller Daten weiter laufen kann?
Fake oder Echt
Mitglied

Benutzerprofil
Anmeldungsdatum: 03.10.2007
Beiträge: 888
Beitrag Fake oder Echt Mitglied 10:00:12 15.09.2011   Titel:              Zitieren

empfängst und sendest du die daten zeichenweise oder als string ?
und normalerweise läuft recv nicht einfach weiter, es sei denn du sendest halt immer wieder was neu oder du hast iwo ein speicher problem, alles in allem wär der entsprechende code ganz interessant :)

_________________
Entwicklungsumgebung: Code::Blocks 10.05, Windows 7, C++, WinAPI, OpenGL
http://xourscode.lima-city.de/
DaRe
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.09.2011
Beiträge: 218
Beitrag DaRe Mitglied 21:51:56 22.09.2011   Titel:              Zitieren

PlanloserCoder schrieb:
Weiß jemand warum bei mir die recv Funktion nicht ganz geht?

Also ich hoffe doch mal sehr, dass recv geht. Immerhin ist das keine Funktion die man so am Rande nutzt.

PlanloserCoder schrieb:
Also besser gesagt will ich das das er die While schleife verlässt wenn ein bestimmtes Zeichen im String vorliegt... das letzte Zeichen beim empfangen endet mit "]", dennoch läuft die schleife weiter auch wenn ich (c == ']') in den Funktion schreibe. Die Text Datei wird ohne Zeichen einfach weiter gefüllt da recv nicht gestoppt wird. Weiß jemand woran das liegt oder wie ich am besten aus der while schleife raus komme wenn das letzte zeichen ein "]" ist, so das mein Programm nach empfangen aller Daten weiter laufen kann?


-> Ist der TCP Socket blockierend(bin mir selbst nicht sicher, aber wenn der non-blocking ist, müsste recv einfach durchlaufen und einen Fehler returnen geben, wenn keine Daten anliegen)? Ich geh mal von TCP aus, wenn du dich bei HTTP meldest.

-> Was ist denn die genaue Rückgabe von recv?

-> Unter Linux kannst du recv ebenfalls nicht blockierend einstellen. Ist das MSG_DONTWAIT Flag in recv gesetzt?

Am besten du lässt mal ein bisschen Code sehen, dann kann ich mir auch ein besseres Bild machen.


Zuletzt bearbeitet von DaRe am 21:53:02 22.09.2011, insgesamt 1-mal bearbeitet
Skylax
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.01.2012
Beiträge: 1
Beitrag Skylax Mitglied 01:09:51 19.01.2012   Titel:   Bug in 07.cpp            Zitieren

Der Artikel ist zwar jetzt schon ziemlich alt und ich weiß nicht ob das noch jemanden interessiert, aber die letzte Version des Programms (07.cpp, Link im Schlusswort) hat einen Bug im "Chunked download" Teil. Hier wird zunächst die Chunksize mit der GetLine Funktion ausgelesen (welche in den globalBuffer schreibt), um dann mit Recv den html text zu empfangen. Wenn das Ende des Chunks erreicht ist wird mit zweimaligem Aufruf von recv noch das verbleibende CRLF (\r\n) entsorgt (sowie im Artikel beschrieben). Die gemischte Verwendung der lowlevel 'recv' Funktion und high level 'Recv' Funktion ist hier aber problematisch. Ist der Chunk nämlich kleiner als die in GetLine verwendete Puffergröße, so ist das verbleibenden CRLF schon im globalBuffer, die recv löscht dann Zeichen die erst später kommen, während \r\n im globalBuffer verbleibt. Beim nächsten GetLine Aufruf wird dann \r in den sstream geschrieben und die falsche Chunksize ausgelesen, so dass das Programm fälschlicherweise abbricht. Entweder man ersetzt die for-schleife durch Recv(socker, &temp, 2,0) oder man macht es wie folgt:
C/C++ Code:
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
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
cout << "Downloading... (Chunked)" << endl;
while(true)
{
    stringstream sstream;
    GetLine(Socket, sstream);
    //weiter Zeile auslesen, falls ein \r\n vorliegt:
    if(sstream.str() == "\r")  
    {
       GetLine(Socket, sstream);
    }
    int chunkSize = -1;
    sstream >> hex >> chunkSize; // Größe des nächsten Parts einlesen
    if(chunkSize <= 0)
    {
       break;
    }
    cout << "Downloading Part (" << chunkSize << " Bytes)... " << endl;
    recvSize = 0; // Vor jeder Schleife wieder auf 0 setzen
    while(recvSize < chunkSize)
    {
          int bytesToRecv = chunkSize - recvSize;
          if((bytesRecv = Recv(Socket, buf, bytesToRecv > sizeof(buf)?sizeof(buf) : bytesToRecv, 0)) <= 0)
          {
              throw CreateSocketError();
          }
          recvSize += bytesRecv;
          fout.write(buf, bytesRecv);
          cout << "\r" << recvSize * 100 / chunkSize << "%" << flush;
     }
     cout << endl;    
}
C/C++ Code:
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
cout << "Downloading... (Chunked)" << endl;
while(true)
{
stringstream sstream;
GetLine(Socket, sstream);
//weiter Zeile auslesen, falls ein \r\n vorliegt:
if(sstream.str() == "\r")
{
GetLine(Socket, sstream);
}
int chunkSize = -1;
sstream >> hex >> chunkSize; // Größe des nächsten Parts einlesen
if(chunkSize <= 0)
{
break;
}
cout << "Downloading Part (" << chunkSize << " Bytes)... " << endl;
recvSize = 0; // Vor jeder Schleife wieder auf 0 setzen
while(recvSize < chunkSize)
{
int bytesToRecv = chunkSize - recvSize;
if((bytesRecv = Recv(Socket, buf, bytesToRecv > sizeof(buf)?sizeof(buf) : bytesToRecv, 0)) <= 0)
{
throw CreateSocketError();
}
recvSize += bytesRecv;
fout.write(buf, bytesRecv);
cout << "\r" << recvSize * 100 / chunkSize << "%" << flush;
}
cout << endl;
}
C/C++ Code:
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
cout << "Downloading... (Chunked)" << endl;
while(true)
{
    stringstream sstream;
    GetLine(Socket, sstream);
    //weiter Zeile auslesen, falls ein \r\n vorliegt:
    if(sstream.str() == "\r")  
    {
       GetLine(Socket, sstream);
    }
    int chunkSize = -1;
    sstream >> hex >> chunkSize; // Größe des nächsten Parts einlesen
    if(chunkSize <= 0)
    {
       break;
    }
    cout << "Downloading Part (" << chunkSize << " Bytes)... " << endl;
    recvSize = 0; // Vor jeder Schleife wieder auf 0 setzen
    while(recvSize < chunkSize)
    {
          int bytesToRecv = chunkSize - recvSize;
          if((bytesRecv = Recv(Socket, buf, bytesToRecv > sizeof(buf)?sizeof(buf) : bytesToRecv, 0)) <= 0)
          {
              throw CreateSocketError();
          }
          recvSize += bytesRecv;
          fout.write(buf, bytesRecv);
          cout << "\r" << recvSize * 100 / chunkSize << "%" << flush;
     }
     cout << endl;    
}

wobei ich die for-schleife weggelassen und durch einen bedingten GetLine Aufruf ersetzt habe.
C/C++ Forum :: Die Artikel ::  Sockets und das HTTP-Protokoll  
Gehen Sie zu Seite Zurück  1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können keine 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, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de 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.