2009-11-26 13 views
0

Je travaille sur la création d'un serveur HTTP pour ma classe. Mais, le fichier retourné n'est pas affiché par Firefox. Je construis un en-tête de réponse et mettre dans le droit content-length du fichier que je veux envoyer, puis j'envoie les en-têtes de réponse avec un appel à send(). Ensuite, j'utilise à nouveau send() pour envoyer le fichier, pourquoi Firefox n'affiche pas le fichier? Je posterai le code correspondant ci-dessous.Les données ne sont pas envoyées avec la réponse http dans mon serveur http

Comme vous le verrez avec le code, j'ai de la difficulté à envoyer un error_response, lors d'une erreur 404. En utilisant les en-têtes http live, je peux voir que Firefox reçoit l'en-tête de réponse correct, et le imprime la bonne réponse. Pourquoi Firefox ne l'affiche-t-il pas? Ai-je besoin de faire un seul appel à send() contenant l'en-tête et le paquet de réponse?

// send response headers 
    response->Print(buffer, 2000); 
    if (send(acc_tcp_sock, buffer, sizeof(buffer), 0) < 0) { 
     cerr << "Unable to send response headers to client." << endl; 
     return 5; 
    } 

    // if 200 and GET then send file 
    if (response->Get_code() == 200 && method == "GET") { 
     // send file 
    } 

    // close file, if it has been opened 
    if (response->Get_code() == 200) { 
     fclose(returned_file); 
    } 
    else if (method == "GET") { 
     if (send(acc_tcp_sock, error_response.c_str(), error_response.length(), 0) < 0) { 
     cerr << "Unable to send data to client." << endl; 
     return 6; 
     } 
     cout << error_response << endl; 
    } 

    close(acc_tcp_sock); // close the connection 
    } 

    return 0; 
} 

Répondre

0

Avez-vous essayé d'envoyer l'en-tête de réponse et le fichier dans la commande même envoi? Y at-il un moyen de savoir ce que reçoit firefox? Vous pouvez essayer d'écrire, à l'aide d'une classe HTTPRequester, une application de console qui envoie une requête HTTP à votre serveur et de voir ce qu'il obtient en retour.

+0

Je pourrais essayer cela et je pense que cela fonctionnerait probablement, mais est-ce une exigence de le faire de cette façon? Que faire si le fichier est trop volumineux pour être complètement mis en mémoire tampon et que vous devez effectuer plusieurs envois? – adhanlon