voici le code, en plus visible j'espere :
// // (EVENT) Lorsqu'il recoit qqchose // void __fastcall GParse::Recevoir(TCustomWinSocket *sock) {
Socket = sock; GPacket *gp = new GPacket; gp->taille = sock->ReceiveLength(); gp->ptr = new char[gp->taille]; sock->ReceiveBuf(gp->ptr,gp->taille); AnalyserPacket(gp); delete [] gp->ptr; delete gp;
}
// // Analyse du packet. // ------------------- // Ici on a recu un nouveau packet, on va l'analyser // void __fastcall GParse::AnalyserPacket(GPacket *gp) { // oin clean la string if (!is_file) ClearPacket(gp); // on vérifie si on recoit un flag de commencement de fichier. if ( !strncmp(gp->ptr, RECV_FILETAG , strlen(RECV_FILETAG) ) ) { is_file = true; memset(filename,0,MAX_FILELENGTH); strcpy(filename, Right(gp->ptr, strlen(gp->ptr) - strlen(RECV_FILETAG)) ); ClearFile(filename); fichier->open(filename,ios::out|ios::binary); return; } if ( !strncmp(gp->ptr, EOFT , strlen(EOFT) ) ) { is_file = false; fichier->close(); return; }
// on write ou non sur le fichier. is_file ? Recevoir_Fichier(gp) : Parse_Packet(gp); }
// // Si on est en mode fichier, cette fonction est called // pour mettre en fichier ce qu'il recoit. // void __fastcall GParse::Recevoir_Fichier(GPacket *gp) { fichier->write(gp->ptr,gp->taille); }
// // si c pas un fichier on call cette fonction pour analyser le message du packet // void __fastcall GParse::Parse_Packet(GPacket *gp) { if (!strncmp(gp->ptr,RECV_MSGBOX,strlen(RECV_MSGBOX))) MessageBox(NULL,Right(gp->ptr,strlen(gp->ptr)-strlen(MSGBOX_TITLE)),MSGBOX_TITLE,MB_OK); }
|
-------------------------------
Réponse au message :
-------------------------------
> Quelqu'un peut-il me dire pourquoi est-ce qu'avec le code ci-dessous je suis obligé d'envoyer des packets d'1 octet pour que le fichier soit complet ?
>
> Si j'envois des packets d'1Ko par exemple, le fichier qui faisait initialement ~ 500Ko ne fait plus que 30Ko après l'upload.
>
> Note : Si j'envoi des packets de 20Octets par exemple, j'obtient 1x/2 la bonne taille du fichier après l'upload.
>
> Est-ce que mon client envoit trop vite ?
> Que passa ?
>
>
> //
> // (EVENT) Lorsqu'il recoit qqchose
> //
> void __fastcall GParse::Recevoir(TCustomWinSocket *sock)
> {
>
> Socket = sock;
> GPacket *gp = new GPacket;
> gp->taille = sock->ReceiveLength();
> gp->ptr = new char[gp->taille];
> sock->ReceiveBuf(gp->ptr,gp->taille);
> AnalyserPacket(gp);
> delete [] gp->ptr;
> delete gp;
> }
>
>
> //
> // Analyse du packet.
> // -------------------
> // Ici on a recu un nouveau packet, on va l'analyser
> //
> void __fastcall GParse::AnalyserPacket(GPacket *gp)
> {
> // oin clean la string
> if (!is_file) ClearPacket(gp);
> // on vérifie si on recoit un flag de commencement de fichier.
> if ( !strncmp(gp->ptr, RECV_FILETAG , strlen(RECV_FILETAG) ) ) {
> is_file = true;
> memset(filename,0,MAX_FILELENGTH);
> strcpy(filename, Right(gp->ptr, strlen(gp->ptr) - strlen(RECV_FILETAG)) );
> ClearFile(filename);
> fichier->open(filename,ios::out|ios::binary);
> return;
> }
> if ( !strncmp(gp->ptr, EOFT , strlen(EOFT) ) ) {
> is_file = false;
> fichier->close();
> return;
> }
>
> // on write ou non sur le fichier.
> is_file ? Recevoir_Fichier(gp) : Parse_Packet(gp);
> }
>
> //
> // Si on est en mode fichier, cette fonction est called
> // pour mettre en fichier ce qu'il recoit.
> //
> void __fastcall GParse::Recevoir_Fichier(GPacket *gp)
> {
> fichier->write(gp->ptr,gp->taille);
> }
>
>
> //
> // si c pas un fichier on call cette fonction pour analyser le message du packet
> //
> void __fastcall GParse::Parse_Packet(GPacket *gp)
> {
> if (!strncmp(gp->ptr,RECV_MSGBOX,strlen(RECV_MSGBOX)))
> MessageBox(NULL,Right(gp->ptr,strlen(gp->ptr)-strlen(MSGBOX_TITLE)),MSGBOX_TITLE,MB_OK);
> }
>
>
>