guiguikun
Messages postés92Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention 1 octobre 2003
-
28 août 2003 à 16:48
guiguikun
Messages postés92Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention 1 octobre 2003
-
28 août 2003 à 17:23
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 ?
//
// 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);
}
guiguikun
Messages postés92Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention 1 octobre 20031 28 août 2003 à 17:23
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);
}