C++ webserver - Aanroep van bestanden

  • Onderwerp starter Onderwerp starter Xabre
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

Xabre

Gebruiker
Lid geworden
22 sep 2007
Berichten
55
Hoi,


Ik heb ondertussen een server gemaakt voor een groter project van mij, maar ik heb gemerkt
dat ik met deze server een paar extra functies zou kunnen geven aan mijn groter project.

Daarom heb ik mij verdiept in het aanpassen van de code voor compatible te zijn met een HTTP 1.1 requests voor index.html , ok ja ik kan naar mij server surfen, en ik krijg netjes een pagina voorgeschoteld, maar dit is zonder links naar foto's/css in de pagina.

Nu heb ik geprobeert om foto's in te laden via simpel ifstreams, maar dit lijkt niet te werken, ook als ik in header aangeef dat ik een image doorzend...
Heeft iemand ervaring met dit soort zaken?
 
Mischien omdat je de plaatjes opent als tekst?

De headers moeten in ieder geval uit Content-Type: image/xxx en Content-Length: 123 bestaan. Dan accepteerd de browser het.
 
Hoi,

Dit is momenteel mijn code, als ik de foto opsla dan word er 4kb opgeslagen en daarbij stopt het...

Code:
Buffer = "HTTP/1.1 200 OK\r\nConnection: close\r\nContent-Length: 104960\r\nContent Type: image/bmp\r\n\r\n";
                 SendData();
                 
                 char bf[512];
                 ifstream file;
                 
                 file.open( "logo.bmp" );
                 
                 int i = 0;
                 
                 while( i++ < 100 )
                 {
                        file.getline(bf,512);                        
                        Buffer = bf;
                                               
                        
                        SendData();
                        Sleep(1);
                 }
                 
                 file.close();               
                 Disconnect();
 
file.getline haalt slechts een regel tekst op (alle data tot een newline teken)
Probeer het dus met een normale read.

Ik heb een tijdje terug ook een miniatuur webserver geschreven, een fragment daaruit:

Code:
            bes = fopen(buf, "rb");
            if(bes) {

                fseek(bes, 0, SEEK_END);
                x = ftell(bes);
                fseek(bes, 0, SEEK_SET);
                for(i = 0;i < https_mediatypes_count;i++) {
                    if(!strcasecmp(uri+strlen(uri)-3, https_mediatypes_ext[i]))
                        break;
                }
                sprintf(outbuf, "HTTP/1.1 200 OK\r\nContent-Length: %li\r\nContent-Type: %s\r\n\r\n", x, https_mediatypes_name[i]);
                send(cdata->socket, outbuf, strlen(outbuf), (x ? MSG_MORE : 0) );
                while(x) {
                    j = fread(outbuf, 1, ((x > 65536) ? 65536 : x), bes);
                    if(send(cdata->socket, outbuf, j, 0) == -1)
                        break;
                    x -= j;
                }
                fclose(bes);

            } else {
                strcpy(outbuf, "HTTP/1.1 404 Not Found\r\nContent-Length: 14\r\nContent-Type: text/plain\r\n\r\nFile not found");
                send(cdata->socket, outbuf, strlen(outbuf), 0);
            }
 
Hoi,


Bedankt voor het antwoord, ik ben al een stap verder geraakt, enkel...
als ik fread gebruik returned deze bijna verkeerde waarden, ik alloceer genoeg geheugen (dus maximum 65536), maar toch zijn de gegevens niet identiek.

Code:
FILE *ParseFile;
                 int size;
                 
                 Replace(cmd[1],"%20"," ");
                 
                 ParseFile = fopen( (char *)(cmd[1] == "/" ? "./index.html" : ("." + cmd[1] ).c_str()), "rb+" );
                 if( ParseFile != NULL )
                 {
                 
                        fseek (ParseFile, 0, SEEK_END);
                        size = ftell (ParseFile);
                        fseek(ParseFile, 0, SEEK_SET);
                 
                        string buf = "HTTP/1.1 200 OK\r\nConnection: close\r\nContent-Length: ";
                        buf += size;
                        buf += "\r\nContent Type: image/bmp\r\n\r\n";
                 
                        Buffer = (char *)buf.c_str();
                        SendData();
                        int readBytes = 0;        
                 
                        Buffer = (char*) malloc (sizeof(char)*65536 );
                 
                        while ( size ) {
                              readBytes = fread(Buffer ,1,( (size > 65535) ? 65535 : size),ParseFile);                               
                              SendData();
                              
                              size-=readBytes;
                        }
              }
 
Laatst bewerkt:
anyway!


Goed nieuws mensen, het is mij gelukt! (allemaal dankzij jullie uiteraard)
maar nu zit ik met het volgende probleem, internet explorer heeft het moeilijk
met bijvoorbeeld index.html in te laden een foto daarintegen doet hij met gemak...

ik draai ie 7 en als ik kijk naar de headers zijn deze gelijk aan deze van FF.
Ook heeft mijn server geen probleem bij het parsen van de file en door te zenden, enkel het doorzenden naar IE7 loopt ergens mis:s
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan