2010-03-18 20 views
0

Je suis en train de faire une réponse chunked (de gros fichiers) en libevent cette façon ::réponses Chunked à libevent2

evhttp_send_reply_start(request, HTTP_OK, "OK"); 

int fd = open("filename", O_RDONLY); 
size_t fileSize = <get_file_size>; 
struct evbuffer *databuff = NULL; 
for (off_t offset = 0;offset < fileSize;) 
{ 
    databuff = evbuffer_new(); 

    size_t bytesLeft = fileSize - offset; 
    size_t bytesToRead = bytesLeft > MAX_READ_SIZE ? MAX_READ_SIZE : bytesLeft; 

    evbuffer_add_file(databuff, fd, offset, bytesToRead); 
    offset += bytesToRead; 

    evhttp_send_reply_chunk(request, databuff); // send it 
    evbuffer_free(databuff);     // destroy it 
} 

evhttp_send_reply_end(request); 

fclose(fptr); 

problème est ce que j'ai le sentiment que la add_file est asynchrone de sorte que le 3ème ou si evhttp_send_reply_chunk me donne une erreur (ou quelque chose de similaire):

[warn] evhttp_send_chain fermé (45): descripteur de fichier incorrect

J'ai défini MAX_READ_SIZE comme étant 8 pour tester réellement le codage de transfert par morceaux. J'ai remarqué qu'il y avait une méthode evhttp_request_set_chunked_cb (struct evhttp_request *, void(*cb)(struct evhttp_request *, void *)) que je pouvais utiliser, mais je n'ai trouvé aucun exemple sur la façon d'utiliser.

Par exemple, comment pourrais-je passer un argument au rappel? L'argument semble être le même que celui qui a été passé au gestionnaire de requêtes, ce qui n'est pas ce que je veux, parce que je veux créer un objet qui contient le descripteur de fichier et le décalage de fichier que j'envoie.

Appréciez toute l'aide.

Merci à l'avance Sri

Répondre

0

Le libevent v2 documentation ne dit pas que c'est async, mais il ne dit qu'il ferme le descripteur de fichier qui votre code ne tient pas compte.

Je crois que vous devez déplacer int fd = open("filename", O_RDONLY); à l'intérieur de votre boucle.

Vous pouvez également tester la gestion des blocs en dehors de votre code de fichier en créant simplement un tampon de chaîne à partir de zéro.

à part cela, (et la dernière ligne qui devrait être fclose(fp); votre exemple semble correct

0

Nice compagnon. Merci pour cela. Je viens de réaliser que la seule raison pour laquelle je voulais les transferts chunked devaient éviter tampon lit Mais comme evbuffer_add_file utilise déjà sendfile (s'il le trouve) ce n'est pas vraiment un problème

J'ai donc retiré la boucle complètement et j'ai essayé, mais le contenu n'est toujours pas envoyé, mais au moins cette fois je n'ai pas le erreur de descripteur de fichier incorrect (vous avez raison - ceci était dû au fait que le fichier était fermé - une vérification des handles de fichiers a confirmé ceci!).

+1

Sri, s'il vous plaît mettez à jour votre question avec cette note et acceptez une réponse (ou ajoutez des commentaires à une question), essayez de ne pas ajouter de clarification dans d'autres réponses – Jehiah